一、原型鏈圖示
Foo為建構式,foo是Foo的實體化物件,Foo.prototype是原型物件,
__proto__屬性是物件特有的,prototype屬性是函式特有的,

二、原型鏈的查找機制
js規定,所有的(實體)物件都有自己的原型物件(Foo.prototype),
查找的順序是:物件的原型 ==> 原型的原型 ==> 原型的原型的原型 ==> ... ==> Object.prototype ==> null
如果一層一層查找,所有的物件的原型都會找到Object.prototype,所有的物件都繼承了Object.prototype中的屬性和方法, 如toString()

三、原型鏈的作用
定制所有實體物件共享的屬性和方法,
讀取屬性和方法的規則:
- js引擎會先尋找物件本身的屬性和方法,如果找不到那就去原型物件上去找,如果還是找不到,就去原型的原型去找,如果直到最頂層Object.prototype還是找不到,就會回傳undefined,
- 如果物件和它的原型都定制了同名的屬性,那么優先讀取物件自身的屬性,
function Foo() {};
Foo.prototype.name = 'mm';
var f = new Foo();
console.log(f.age); // undefined
f.name = 'gg'
console.log(f.name); // gg
console.log(Foo.prototype.name); // mm
四、constructor屬性
constructor表示原型物件和建構式之間的關聯關系,
現在我們改造一個自定義的陣列物件,就可以通過prototype實作,
我們知道原型物件的constructor是指向建構式本身的,因此當我們改變了原型物件的指向時,要把constructor改回自定義的建構式,以免出現參考問題,
function myArray() {};
myArray.prototype = Array.prototype; // 把陣列的屬性和方法賦值給myArray
myArray.prototype.constructor = myArray; // 把構造器指向myArray 不改的話指向Array
var arr = new myArray();
arr.push(1,2,3);
console.log(myArray.prototype.constructor === myArray); // true
五、建構式、原型物件、實體物件之間的關系
實體物件的__proto__屬性指向了原型物件,
原型物件的constructor屬性指向了建構式,
實體物件的constructor屬性繼承自原型物件的constructor,所以同樣指向了建構式,
(說白了還是那張原型鏈的圖,,,)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/111881.html
標籤:JavaScript
上一篇:ES6---繼續RESTful
下一篇:vue無法跳轉子路由
