1. 工厂模式
function createPerson(name, age) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.say = function() {
alert(this.name);
};
return obj;
}
var p1 = createPerson('shadow', 23);
p1.say();
2. 构造函数模式
2.1 使用new调用
function Person(name, age) {
this.name = name;
this.age = age;
this.say = function() {
alert(this.name);
};
}
var p1 = new Person('shaow', 23);
p1.say();
2.2 不使用new调用
Person('shadow', 21);
window.say();
2.3 在另一对象的作用域中调用
var o = new Object();
Person.call(o, 'shadow', 24);
o.say();
3.原型模式
3.1 可以通过对象实例保存原型中的值,但不能通过对象实例重写原型中的值
function Person() {
}
Person.prototype.name = "prototype val";
var p1 = new Person();
var p2 = new Person();
p1.name = "object val";
alert(p1.name);//prototype val
alert(p2.name);//object val
当为对象添加属性时,只会屏蔽调原型对象中的相同属性,不会修改原型对象中的属性
3.2 可以使用delete删除实例属性
function Person() {
}
Person.prototype.name = "prototype val";
var p1 = new Person();
var p2 = new Person();
p1.name = "object val";
delete p1.name;
alert(p1.name);//prototype val
alert(p2.name);//prototype val
3.3 使用hasOwnProperty方法可以检测一个属性是存在于实例中还是原型中
function Person() {
}
Person.prototype.name = "prototype val";
var p1 = new Person();
var p2 = new Person();
p1.name = "object val";
alert(p1.hasOwnProperty("name"));//true
delete p1.name;
alert(p1.hasOwnProperty("name"));//false
4.组合使用构造模式和原型模式(默认定义引用类型的模式)
function Person(name){ this.name = name; this.friends = ["shadow", "parsons"]; }
Person.prototype = { constructor: Person, say: function(){ alert(this.name); } };
var person1 = new Person();//此时Person var person2 = new Person(); person1.friends.push("james"); alert(person1.friends);//[shadow, parsons, james] alert(person2.friends);//[shadow, parsons] alert(person1.friends == person2.friends);//false alert(person1.say == person2.say);//true
构造函数用于构造实例属性,原型模式用于构造方法和共享属性