一、 采用工厂模型创建对象
function Persion(name,age,address){
var persion = new Object();
persion.name = name;
persion.age = age;
persion.address = address;
return persion;
}
优点:解决了创建多个相似对象的问题
缺点:无法解决对象识别的问题
二 、采用构造方法创建对象:创建对象必须使用new操作符。会经历以下的4格步骤
1、创建一个新的对象
2、将构造函数的作用域赋给新对象
3、执行构造函数中的代码
4、返回新的对象
function Persion(name,age,address){
this.name = name;
this.age = age;
this.address = address;
this.sayName = sayName;
}
function sayName(){
alert(this.name);
}
优点:1、解决了创建多个相似对象的问题 2、解决对象识别的问题 缺点:每个方法都要在每个实例上重新创建一遍
三、采用原型模型进行创建
function Persion(){
}
Persion.prototype.sayName = function (){
alert(this.name);
};
Persion.prototype.name = "humiaomiao";
Persion.prototype.age = 16;
Persion.prototype.address = "河南";
优点:1、解决了创建多个相似对象的问题
2、解决对象识别的问题
3、避免了每个方法都要在每个实例上重新创建一遍
缺点:原型模式的最大问题是其共享本质所造成的。
原型模型的所有属性都是被很多实例共享的,对于函数是非常合适的。
对于那些包含基本值的属性也是可以共用的,
但是如果是包含应用型的属性来说,就不适合采用原型模式了。
四、组合使用构造函数和原型模式
1、这是最常用的一种创建自定义类型的方式。
2、构造函数模型用于定义实例属性
3、原型模式用于定义方法和共享属性
function Persion(name,age,address){
this.name = name;
this.age = age;
this.address = address;
this.friends = ["Shelby","Court"];
}
Persion.prototype.constructor = Persion;
Persion.prototype.sayName = function(){
alert(this.name);
}
点评:
这种构造函数与原型混成的模式,是目前ECMAScript中使用最广泛,
认同度最高的一种创建自定义类型的方法。
五、动态原型模式
1、有其他OO语言的经验的开发人员在看到独立的构造函数和原型是,很可能会感到非常的困惑。
2、动态原型模型正是致力于解决这个问题的一个方案,
它把所有的信息都封装在一个狗仔函数中。而通过在构造函数中初始化原型
function Persion(name,age,address){
this.name = name;
this.age = age;
this.address = address;
if(typeof this.sayName != "function"){
Persion.prototype.sayName = function(){
alert(this.name);
}
}
}
六、寄生省构造函数模式
1、通常,在前述的几中模式都不太适用的情况下,可以使用寄生构造函数模式
2、这个模式可以在特殊的情况下用来为对象建构造函数
3、下面就是扩展了一个数组的功能
function SpecialArray(){
var values = new Array();
// 添加值
values.push.apply(values,arguments);
// 添加方法
values.toPipedString = function () {
return this.join("|")
};
return values;
}
var colors = new SpecialArray("red","blue","green");
console.log(colors.toPipedString()); // red|blue|green
七、稳妥构造模式 1、稳妥对象是指没有公共属性,而且其方法也不引用this的对象。
function Persion(name,age,address){
var o = new Object();
o.name = name;
o.age = age;
o.address = address;
o.sayName = function(){
alert(name);
}
return o;
}