使用原型對象的好處是能夠讓全部對象實例共享它所包含的屬性和方法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
訪問獲得。