一、創建自定義對象最簡單的方式就是創建一個object實例,然後爲它添加屬性和方法。
var person=new Object();
person.name="John";
person.age=20;
person.sayName=function(){
alert(this.name);
};
二、通過對象字面量進行定義。
var person={
name:"John",
age:20,
sayName:function(){
alert(this.name);
}
};
三、工廠模式
function createPerson(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.sayName=function(){
alert(this.name);
};
return o;
}
var person1=createPerson("John",20);
var person2=createPerson("Mike",25);
優點:解決了創建 多個相似對象的問題
缺點:無法知道一個對象實例的具體類型
四、構造函數模式
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name);
};
}
var person1=new Person("John",20);
var person2=new Person("Mike",25);
優點:較之工廠模式,可以識別對象的具體類型(instanceof)。
缺點:每個方法都要在每個實例上重新創建一遍,每個Person實例都包含一個不同的function實例(函數的作用域鏈和標識符解析都不同),無法實現方法的共享。
五、原型模式
function Person(){}
Person.prototype.name="John";
Person.prototype.age=20;
Person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Person();
person1.sayName(); //"John"
var person2=new Person();
person2.sayName(); //"John"
alert(person1.sayName==person2.sayName); //true
更簡單的原型模式
function Person(){}
Person.prototype={
constructor:Person,
name:"John",
age:20,
sayName:function(){
alert(this.name);
}
};
優點:可以讓所有對象實例共享它所包含的屬性和方法。
缺點:無法擁有獨立的引用類型屬性。沒有爲構造函數傳遞初始化參數,使得所有實例在默認情況下都取得相同的屬性值。
六、組合使用構造函數模式和原型模式
function Person(name,age){
this.name=name;
this.age=age;
this.friends=["Kevin","Jason"];
}
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
};
var person1=new Person("John",20);
var person2=new Person("Mike",25);
person1.friends.push("Van");
alert(person1.friends); //"Kevin,Jason,Van"
alert(person2.friends); //"Kevin,Jason"
alert(person1.sayName===person2.sayName); //true
這是定義應用類型的一種默認模式。