1.工厂模式
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.sayName = function(){alert(this.name);};
return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。
2.构造函数模式
function Person(name, age, job){
this.name = name;
this.sayName = function(){alert(this.name);};
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
在前面的例子中,person1 和 person2 都有一个名为 sayName()的方法,但那两个方法不是同一个 Function 的实例。
function Person(name, age, job){
this.name = name;
this.sayName = sayName;
}
function sayName(){alert(this.name);}
var person1 = new Person("Nicholas", 29, "Software Engineer");
这样做确实解决了两个函数做同一件事的问题,可是新问题又来了:在全局作用域中定义的函数实际上只能被某个对象调用,这让全局作用域有点名不副实。而更让人无法接受的是:如果对象需要定义很多方法,那么就要定义很多个全局函数,于是我们这个自定义的引用类型就丝毫没有封装性可言了。
3.原型模式
function Person(){}
Person.prototype.name = "Nicholas";
Person.prototype.sayName = function(){alert(this.name);};
var person1 = new Person();
首先,它省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都将取得相同的属性值。虽然这会在某种程度上带来一些不方便,但还不是原型的最大问题。原型模式的最大问题是由其共享的本性所导致的。原型中所有属性是被很多实例共享的,这种共享对于函数非常合适。对于那些包含基本值的属性倒也说得过去,毕竟(如前面的例子所示),通过在实例上添加一个同名属性,可以隐藏原型中的对应属性。然而,对于包含引用类型值的属性来说,问题就比较突出了。来看下面的例子。
person1.friends.push("Van");
4.构造函数和原型模式结合
function Person(name, age, job){
this.name = name;
this.friends = ["Shelby", "Court"];
}
Person.prototype = {
constructor : Person,
sayName : function(){alert(this.name);}
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数;可谓是集两种模式之长。
5.动态原型模式
function Person(name, age, job){
this.name = name;//属性
if (typeof this.sayName != "function"){
Person.prototype.sayName = function(){alert(this.name);};//方法
}
}
var friend = new Person("Nicholas", 29, "Software Engineer");
6.寄生构造函数
function Person(name, age, job){
var o = new Object();
o.name = name;
o.sayName = function(){alert(this.name);};
return o;
}
var friend = new Person("Nicholas", 29, "Software Engineer");
7.稳妥构造函数模式
function Person(name, age, job){
var o = new Object();//创建要返回的对象
o.sayName = function(){alert(name);//可以在这里定义私有变量和函数//添加方法};
return o;//返回对象
}
网友评论