1、工厂模式
用函数封装。
function creatPerson(name,age,job){
var 0 = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = creatPerson("tfs",5,"singer");
var person2 = creatPerson("tfr",6,"painter");
优点:创建了person对象,可以无数次调用。
缺点:无法知道对象的类型。
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("tfs",5,"singer");
var person2 =new Person("tfr",6,"painter");
检测对象类型:instanceof
缺点:每个成员无法复用。
3、原型模式。
prototype
[[prototype]]
constructor:每创建一个函数,就会同时创建它的prototype对象,这个对象 会自动获得constructor属性。
hasOwnProperty():实例定义该属性才返回true。
如:var person1 =new Person();
person1.name = "tfs";
alert(person1.hasOwnProperty("name")); //true
in:对象能访问给定属性时返回true,与该属性在实例中还是原型中无关。alert("name" in person1); //true
for-in循环:返回所有对象可以访问的,可枚举的属性。
hasPrototypeProperty():属性在原型中则返回true。alert(hasPrototypeProperty(person,"name"));
Object.keys():取得所有可枚举的实例属性。var keys = Object.keys(Person.prototype); alert(keys); //"name"
Object.getOwnPropertyNames():可获得所有实例属性,无论是否可枚举。
原型的动态性:
function Person(){}
var friend = new Person();
Person.prototype = {
constructor:Person; //用字面量的形式创建新对象,若不指定constructor,将不再指向Person。
name:"tfs";
age:5;
}
alert(friend.name); //error
原型对象缺点:所有实例共享一个数组。
function Person(){}
Person.prototype = {
constructor:Person;
name:"tfs";
age:5;
friends:["1","2"];
};
var person1 = new Person();
var person2 = new Person();
person1.friends.push("3");
alert(person1.friends); //"1,2,3"
alert(person2.friends); //"1,2,3"。会发现所有实例共享一个数组。
4、构造函数+原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends =["1","2"] ;
};
Person.prototype ={
constructor:Person;
sayName:function(){
alert(this.name);
}
}
var person1 = new Person();
var person2 = new Person();
person1.friends.push("3");
alert(person1.friends); //"1,2,3"
alert(person2.friends); //"1,2"
alert(person1.sayName===person2.sayName); //true
5、动态原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayName != "function"){ //只在 sayName()方法不存在时,才把它添加到原型里。Person.propotype.sayName = function(){
alert(this.name);
}
}
var person =new Person("tfs",5,"singer");
person.sayName();
6、寄生构造函数模式
7、稳妥构造函数模式