1. 程式人生 > 實用技巧 >js原型鏈

js原型鏈

1.

function Person(nick, age){
    this.nick = nick;
    this.age = age;
}
Person.prototype.sayName = function(){
    console.log(this.nick);
}

var p1 = new Person('Byron', 20);

var p2 = new Person('Casper', 25);

p1.sayName()  // Byron

p2.sayName()  // Casper

p1.__proto__ === Person.prototype       //
true p2.__proto__ === Person.prototype //true p1.__proto__ === p2.__proto__ //true Person.prototype.constructor === Person //true

2.原型鏈


var arr = [1,2,3]

arr.valueOf()  //  [1, 2, 3]


我們來看看上圖的關係 arr.__proto__
=== Array.prototype true Array.prototype.__proto__ === Object.prototype true arr.__proto__.__proto__
=== Object.prototype true // 原型鏈的終點 Object.prototype.__proto__ === null true 原型鏈如下: arr ---> Array.prototype ---> Object.prototype ---> null 這就是傳說中的原型鏈,層層向上查詢,最後還沒有就返回undefined

************************************************************


var obj = { name: 'obj' } 

在我們沒有對 obj 進行任何其他操作之前,發現 obj 已經有幾個屬性(方法)了:


那麼問題來了:valueOf / toString / constructor 是怎麼來?我們並沒有給 obj.valueOf 賦值呀。


要搞清楚 valueOf / toString / constructor 是怎麼來的,就要用到 console.dir 了。



1
. obj 本身有一個屬性 name(這是我們給它加的) 2. obj 還有一個屬性叫做 __proto__(它是一個物件) 3. obj.__proto__ 有很多屬性,包括 valueOf、toString、constructor 等 4. obj.__proto__ 其實也有一個叫做 __proto__ 的屬性(console.log 沒有顯示),值為 null 現在回到我們的問題:obj 為什麼會擁有 valueOf / toString / constructor 這幾個屬性? 答案: 這跟 __proto__ 有關。 當我們「讀取」 obj.toString 時,JS 引擎會做下面的事情: 1. 看看 obj 物件本身有沒有 toString 屬性。沒有就走到下一步。 2. 看看 obj.__proto__ 物件有沒有 toString 屬性,發現 obj.__proto__ 有 toString 屬性,於是找到了 所以 obj.toString 實際上就是第 2 步中找到的 obj.__proto__.toString。 可以想象, 3. 如果 obj.__proto__ 沒有,那麼瀏覽器會繼續檢視 obj.__proto__.__proto__ 4. 如果 obj.__proto__.__proto__ 也沒有,那麼瀏覽器會繼續檢視 obj.__proto__.__proto__.proto__ 5. 直到找到 toString 或者 __proto__ 為 null。 上面的過程,就是「讀」屬性的「搜尋過程」。 而這個「搜尋過程」,是連著由 __proto__ 組成的鏈子一直走的。 這個鏈子,就叫做「原型鏈」。

轉:https://zhuanlan.zhihu.com/p/23090041

轉:https://zhuanlan.zhihu.com/p/35790971