原型和原型链

    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 的实例!

```

你可能感兴趣的:(原型和原型链)