Prototype属性的作用
JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享。如果属性和方法定义在原型上,所有实例对象都可共享,并且节约了内存,体现了对象之间的联系。JavaScript中每个函数都有prototype属性,指向一个对象。对于构造函数来说,生成实例函数的时候,该属性会自动成为实例对象的原型。
function Animal(name){
this.name = name;
}
Animal.prototype.color = 'black';
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.color;//black
dog.color;//black
Animal.prototype.color = 'red';
cat.color;//red
cat.color = 'white';
cat.color;//white
原型对象的属性不是实例对象的自身属性,只要修改原型对象,马上就能作用到实例对象上。由于实例对象没有color属性,都是读取原型对象的color属性。当实例对象没有某个属性或方法时,就会去原型对象上找。如果实例对象自身拥有这个属性,则使用自身属性,不用去原型对象寻找。
原型链
JavaScript规定所有对象都有自己的原型对象prototype。一方面任何一个对象都可以充当其他对象的原型。另一方面它也有自己的原型。所有对象最终都会上溯到Object.prototype。所有属性都继承自Object.prototype,因此,所有对象都有valueOf和toString方法。Object.prototype的原型是null。null没有任何属性和方法,也没有自己的原型。因此原型链的最后一层是null。
```
var obj = new 构造函数();
obj.__proto__ === 构造函数.prototype
var number = new Number()
number.__proto__ = Number.prototype
Number.__proto__ = Function.prototype // 因为 Number 是 Function 的实例
var object = new Object()
object.__proto__ = Object.prototype
Object.__proto__ = Function.prototype // 因为 Object 是 Function 的实例
var function = new Function()
function.__proto__ = Function.prototype
Function.__proto__ == Function.prototye // 因为 Function 是 Function 的实例!
```