浅析创建javascript对象的方法
一、工厂模式
functionperson(name,age){
varp=newObject();
p.name=name;
p.age=age;
p.showMessage=function(){
console.log("name:"+this.name+"age:"+this.age);
}
returnp;
}
varp1=person("k1",28);
varp2=person("k2",29);
console.log(p1.showMessage==p2.showMessage);//false不是同一个showMessage方法
console.log(p1.constructor);//[object]都是object
工厂模式的缺陷是:没解决对象识别的问题,而且每个对象的showMessage方法都不是同一个方法(每个方法在每个对象实例上都重新创建了一遍),增加了开销
二、构造函数模式
functionPerson(name,age){
this.name=name;
this.age=age;
this.showMessage=function(){
console.log("name:"+this.name+"age:"+this.age);
}
}
varp1=newPerson("k1",28);
varp2=newPerson("k2",29);
console.log(p1.showMessage==p2.showMessage);//false不是同一个showMessage方法
console.log(p1.constructor);//[Person]
console.log(p1instanceofPerson);//true
构造函数模式解决了对象识别的问题,但是每个对象的showMessage方法不是同一个方法(每个方法在每个对象实例上都重新创建了一遍),增加了开销
三、原型模式
functionPerson(){
}
Person.prototype.name="k";
Person.prototype.age=29;
Person.prototype.showMessage=function(){
console.log("name:"+this.name+"age:"+this.age);
};
varp1=newPerson();
p1.showMessage();//name:kage:29
varp2=newPerson();
p2.showMessage();//name:kage:29
console.log(p1.showMessage==p2.showMessage);//true--引用的是同一函数
console.log(p1.constructor)//[Person]--对象识别
console.log(p1instanceofPerson)//true--对象识别
console.log(Person.prototype.isPrototypeOf(p1));//true
console.log(Object.getPrototypeOf(p1)==Person.prototype);//true
原型模式解决了“每个方法在每个对象实例上都重新创建了一遍”的问题,也解决了对象识别的问题
原型模式有个很大的问题是,因为挂载在函数prototype下面的所有对象、变量、函数都是被该函数的所有实例共享的,虽然通过实例p1、p2可以访问到prototype的属性,但是却不能修改属性值,例如p1.name="k1",只是在p1实例上添加了一个name="k1"的属性,并没改到prototype.name。如果是值类型还好,如果是引用类型的话,就会有问题了,看如下的例子
functionPerson(){
};
Person.prototype.age=10;
Person.prototype.array=[1,2,3];
varp1=newPerson();
varp2=newPerson();
console.log(p1.array);//[1,2,3]
console.log(p2.array);//[1,2,3]
p1.array.push(4);
console.log(p1.array);//[1,2,3,4]
console.log(p2.array);//[1,2,3,4]
p1往array里面添加了值,在p2也反映出来了,因为他们都是指向同一个array
四、组合使用构造函数模式和原型模式
这是最常见的创建对象的方式,结合了构造函数和原型模式的优点
functionPerson(name,age){
this.name=name;
this.age=age;
}
Person.prototype.showMessage=function(){
console.log("name:"+this.name+"age:"+this.age);
};
varp1=newPerson("k",30);
p1.showMessage();
五、动态原型模式
主要是解决:把所有的信息都封装在构造函数中,更符合oo的思想
functionPerson(name,age){
this.name=name;
this.age=age;
if(typeofthis.showMessage!="function"){
Person.prototype.showMessage=function(){
console.log("name:"+this.name+"age:"+this.age);
}
}
}
varp1=newPerson("k",30);
p1.showMessage();
六、寄生构造函数模式
functionPerson(name,age){
varo=newObject();
o.name=name;
o.age=age;
o.sayName=function(){
console.log(this.name);
};
returno;
}
varp1=newPerson("k",28);
p1.sayName();
寄生构造函数模式和工厂模式是一模一样的,只不过创建对象的时候使用了new关键字,上例:varp1=newPerson("k",28)。
它的主要作用是:在这个构造函数里面进行功能的扩展,例如,我想定义一个数组类型MyArray,它是以Array数组为基础的,有一个自己的方法,如下
functionMyArray(){
varvalues=newArray();
values.push.apply(values,arguments);
//自己定义的方法
values.toPipedString=function(){
returnthis.join('|');
};
returnvalues;
}
varcolors=newMyArray("red","blue","green");
console.log(colors.toPipedString());
console.log(colorsinstanceofArray);
七、稳妥构造函数模式
稳妥构造函数遵循与寄生构造函数类型的模式,但有两点不同:一是不使用this,二是不使用new调用构造函数
functionPerson(name,age){
varo=newObject();
vartempAge=age;
o.name=name;
o.age=age;
o.sayName=function(){
console.log(name);
}
o.sayAge=function(){
console.log(tempAge);
}
returno;
}
varp1=Person("k1",28);
p1.sayName();//k1
p1.sayAge();//28
p1.name="k2";
p1.age=30;
p1.sayName();//k1
p1.sayAge();//28
看到如上的输出就很好理解什么叫稳妥对象模式了,就是用这种模式创建的对象,没有其他办法能够改变初始化时候传入的值,这里是Person("k1",28),这样的对象就是稳妥对象,实际上这里使用到就是javascript的闭包了。
以上这篇浅析创建javascript对象的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。