使用原型对象的好处是能够让全部对象实例共享它所包含的属性和方法javascript
即原型中的全部属性能够被每个实例共享。java
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
咱们看到person1和person2共享了Person.prototype的全部属性。this
当咱们访问一个属性的时候首先会在实例中查找有没有这个属性,若是没有就会去原型中查找,若是尚未就去原型的原型(Object.prototype.proto )中查找,只要找到就中止查找。prototype
由于code
function Person(){}
没有任何属性,因此person1,person2可以访问的全部属性都是源自原型。对象
虽然能够经过对象实例访问保存在原型中的值,但却不能经过对象实例重写原型中的值。若是咱们 在实例中添加了一个属性,而该属性与实例原型中的一个属性同名,那咱们就在实例中建立该属性,该 属性将会屏蔽原型中的那个属性Nicholas图片
虽然ip
person1.name
访问会获得原型中的值,可是原型链
person1.name="liyuahng"
并不会覆盖掉原型中name属性的值,此时会在实例person1中添加一个值为'liyuhang'在name属性,当咱们访问person1.name属性的时候会首先在实例person1中找到name属性,并输出它的值,此时原型中的name属性依然为 Nicholas ,咱们能够经过原型
person1.__proto__.name
访问获得。