1、原型模式创建对象
我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以有由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型的好处是可以让所有对象实例共享所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,二是可以将这些信息直接添加到原型对象中,如下面的例子所示。
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
}
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true
图6-1展示了Person构造函数、Person的原型属性以及Person现有的两个实例之间的关系
2、构造函数、原型对象和实例的关系
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
这个关系图形象直观的表示了三者间指针的指向。我觉得理解并牢记这张图非常重要。
额外补充一点:我们可以在代码中通过实例.constructor拿到构造函数,这样看起来图里缺少一个由实例直接指向构造函数的.constructor指针箭头,分析本质后发现实际不需要加一个实例到构造函数的箭头。因为实例对象本身并没有.constructor指针,实例对象实际还是调用的原型对象的.constructor指针获取到构造函数。
3、原型链
原型链是实现集成的主要方法。通过让原型对象等于另一个类型的实例。显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。这就是所谓原型链的基本概念。