連結串列資料結構之js原型鏈

BFC發表於2018-07-11

js裡面一切都是物件,包括Function Array var a = 1等;每個物件都有個__proto__屬性,它指向其建構函式的
prototype,也是個物件,也是含有__proto__屬性。

引入:1)typeof用來判斷值是什麼型別,這裡有兩個特殊之處,值為null object array的時候,返回結果都是:
typeof null || object || [] -->  'object'
所以要區分他們需要使用Object.prototype.toString.call()來判斷,原理如下:
http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html
還有一點要注意typeof Array || Object --> 'function'

問題:為什麼要呼叫Object.prototype.toString方法,對於陣列而不能使用array.toString呢?
這要涉及到原型鏈了。

分析:我們知道function函式裡面有個指標prototype指向原型,物件例項裡面有個__proto__也指向原型,它們
的原型都是Object的一個例項,所以它們的原型裡面也有個__proto__指標指向Object.prototype。當呼叫物件
的方法時候先在本物件本身查詢是否有該方法,然後轉到其原型查詢,最後到Object.prototype。

重點:Array.prototype方法寫了Array.toString方法,在原型鏈查詢過程中先找到了Array.toString,便不會
往下查詢,所以Object.toString方法找不到,便沒有使用其最初的功能。

2)instanceof:用來判斷該例項是否屬於該物件,其判斷原理如下: 
obj1.__proto ==> Object2.prototype ==> object3.prototype ==> Object.prototype

obj3 instaneof Object2 // true
obj3 instaneof Object // true

obj3.__proto__指向的原型是否是Object2,是返回true否則繼續往下查詢重複前面的動作,如果為null返回
false

3)new運算子做了哪幾件事情:
function B () {} // 自動生成B.prototype.__proto__ = Object.prototype
// new
var obj = {};
obj.__ptoto__ = B.prototype;
B.call(obj);

4)Object.create()方法建立物件:
Object.create = function (proto) {
  var f = function() {}
  f.prototype = proto;
  return new f();
}
注意:它的例項__proto__指向傳入的引數

5)__proto__ 和 prototype的區別:

__proto__是每個物件含有的屬性,prototype是function例項的特有屬性。
聯絡:__proto__指向其建構函式的prototype。

複製程式碼


相關文章