您的位置:首页 > Web前端 > JavaScript

JavaScript创建对象总结

2014-08-17 22:59 399 查看

工厂模式

function createPerson(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
}
return o;
}
var person1=createPerson("Nicholas",29,"Software Engineer");
var person2=createPerson("Greg",27,"Doctor");


构造函数模式

function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
}
}
var person1=new Person("Nicholas",29,"Software Engineer");
var person2=new Person("Greg",27,"Doctor");


原型模式

先看代码实现:

function Person(){}
Person.prototype.name="Nicholes";
Person.prototype.age=29;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Person();
var person2=new Person();
alert(person1.name);                //Nicholes


然后是构造函数、原型、对象之间的关系:



注意,这种情况下,新对象的属性和方法都是共享的。所以:

person1.name="ll";
alert(person2.name);        //ll


组合使用构造函数模式和原型模式

function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["Nikc","Bob"];
}

var person3=new Person("Person3",22,"cop");
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
}

var person1=new Person("person1",20,"doc");
var person2=new Person("person2",30,"tea");

person1.friends.push("Jack");


动态原型模式

function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
if(typeof Person.prototype.sayName!="function"){
Person.prototype.sayName=function(){
alert(this.name);
}
}
}


动态原型模式是上面组合模式的进一步优化,看起来比较顺眼。

尽量使用这种方法。这样创建出来的对象,属性不共享,方法共享,并且不会再创建对象时在原型那里重复创建sayName方法。

记住往原型那里添加东西时不能使用 重写原型 的方式 ,因为第一个构造出来的对象无法和重写的新原型建立联系。

寄生构造函数模式

function SpecialArray(){
var values=new Array();
values.push.apply(values,arguments);
values.toPipeString=function(){
return this.join(" | ");
}
return values;
}

var colors=new SpecialArray("red","blue","green");

没搞懂有什么用-_-||,建议不使用。

稳妥构造函数模式

function Person(name,age,job){
var o=new Object();
o.sayName=function(){
alert(name);
}
return o;
}
var person1=Person("Jack",20,"Doctor");

此时除了调用person1的sayName方法外,无法访问person1的name属性。对安全性有很高要求时,使用这种方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: