1.创建对象:
var person = new Object();
person.name = "zhangsan";
person.age = 30;
person.job = "software engineer";
person.sayName = function(){
alert(this.name);
}
person.sayName();
缺点:创造不同的对象需要大量重复的代码。
2.工厂模式:
function createObject(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 = createObject("zhangsan",20,"teacher");
var person2 = createObject("lisi",30,"doctor");
person1.sayName();
person2.sayName();
缺点:无法判断对象的类型。alert(typeof person1);alert(person1instanceof Object);
3.构造函数模式:
(1)
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function (){
alert(this.name);
};
}
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");
person1.sayName();
person2.sayName();
alert(person1.sayName == person2.sayName);
缺点:sayName方法执行同样的任务,但创建不同的对象时却要不同的Function。
(2)function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName(){
alert(this.name);
}
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");
person1.sayName();
person2.sayName();
alert(person1.sayName == person2.sayName);
缺点:(2)虽然解决了(1)的问题,但sayName是一个全局函数,却只能被某个对象使用。如果对象由很多方法,就要定义很多全局函数,破坏了函数的封装性。
4.原型模式:
(1)
function Person(){
}
Person.prototype.name = "zhangsan";
Person.prototype.age = 30;
Person.prototype.job = "teacher";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName();
var person2 = new Person();
person2.sayName();
alert(person1.sayName == person2.sayName);
(2)
function Person(){
}
Person.prototype = {
name:"zhangsan",
age:30,
job:"teacher",
friends:["lisi","wangwu"],
sayName:function(){
alert(this.name);
}
};
var person1 = new Person();
var person2 = new Person();
person1.friends.push("zhaoliu");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);
缺点:由(2)可以看出原型的缺点,由于共享的特性,在使用基本类型时可以使用隐藏的手段解决,引用类型会造成共享问题。
5.组合构造函数模式和原型模式function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["wangwu","zhaoliu"];
}
Person.prototype = {
constructor:Person,
sayName: function(){
alert(this.name);
}
};
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");
person1.friends.push("liuqi");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);
alert(person1.sayName == person2.sayName);
6.动态原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["wangwu","zhaoliu"];
if(typeof this.sayName != "function"){
Person.prototype.sayName = function (){
alert(this.name);
};
}
}
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");
person1.friends.push("liuqi");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);
alert(person1.sayName == person2.sayName);
7.寄生构造函数模式:
function Person(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.friends = ["wangwu","zhaoliu"];
o.sayName = function (){
alert(this.name);
};
return o;
}
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");
person1.friends.push("liuqi");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);
alert(person1.sayName == person2.sayName);
8.稳妥构造函数模式:
function Person(name,age,job){
var o = new Object();
o.sayName = function (){
alert(name);
};
return o;
}
var person = Person("zhangsan",20,"teacher");
person.sayName();
特点:与寄生构造函数模式相似,不同点在于一是不使用new调用构造函数,二是在创建对象的实例方法中不使用this.