1.工厂模式
工厂模式:通过函数和传递的参数创建一个包含参数信息的对象。考虑到ECMAScript2015之前不支持创建类,开发人员发明了一种函数,用函数来封装以特定接口创建对象的细节,如下面的代码所示。
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
console.info(this.name);
};
return o;
}
var person1 = createPerson('Nicholas', 29, "softEngineer")
2.构造函数模式
ECMAScript中的构造函数可用来创建特定类型的对象。此外也可以创建自定义的构造函数,从而定义自定义对象的属性和方法。例如,可以使用构造函数模式重写上面的例子。
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = new Person('Nicholas', 29, "softEngineer")
在这个例子里,我们没有在函数内部创建对象而是把属性和方法挂载到this上,并且无返回值。
重点是在我们实例这个构造函数调用new这个关键字的时候,其实我们做了如下四个步骤。
- 创建一个新对象。
- 将构造函数的作用域赋给新对象。与此同时,this也就指向了这个对象。
- 执行构造函数中的代码。
- 返回新对象
3.原型模式
我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,也就是我们把我们想要的属性和方法挂载到了这个对象上。
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.sayName = function(){
alert(this.name)
}
var person1 = new Person();
person1.sayName(); //Nicholas
var person2 = new Person();
person2.sayName(); //Nicholas
很明显这样做的一个好处是所有对象实例都能共享原型上的属性和方法。
理解实例属性和原型属性
hasOwnProperty:用来判断在实例好的对象上某一个属性或者方法是不是一个实例属性或者实例方法。也就是用来区分实例属性和原型属性。
4.组合使用构造函数模式和原型模式
我们在上面提到了用构造函数模式和原型模式。构造函数模式用于定义实例属性,而原型模式用于定义共享的方法和属性,那么我们能不能将两者的优点结合起来,让属性实例,方法共享呢。因为往往不同实例的属性值是不一样的,而方法基本上都是相同的。这就是我们下面要讲到的组合模式。
function Person(){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Count"];
}
Person.prototype={
constructor: Person,
sayName:function(){
alert(this.name);
}
}
var person1 = new Person("Nicholas",29,"Software Engineer");
var person2 = new Person("Greg", 27, "Doctor")
person1.friends.push("Van")
alert(person1.friends)
alert(person2.friends)
alert(person1.firends===person2.friends) //false
alert(person1.sayName === person2.sayName) //true
在这个例子中,实例属性都是在构造函数中定义的,而由所有实例共享的属性constructor和方法sayName()则是在原型中定义的。而修改了person1.friends,并不会影响到person2.friends。
—参考
javascript高级程序设计(第三版)