__proto__屬性

admin發表於2018-11-02

__proto__屬性外觀比較奇特,因為它原本是一個內部屬性。

不過當前主流瀏覽器都支援它,並且ES2015將其標準化。

此屬性可以返回或者設定物件的原型物件。

首先回顧一下關於prototype原型的相關知識。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
function F(){
  this.webName="螞蟻部落";
}
F.prototype={
  age:4,
  address:"青島市南區"
}
let f=new F();
console.log(f.address);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/02/192613vkk67jbkcrcyek24.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).首先建立建構函式F。

(2).設定建構函式的原型物件是一個自定義物件直接量。

(3).那麼建構函式F的物件例項f會繼承原型物件中的屬性。

下面演示一下__proto__屬性在其中的角色,程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
function F(){
  this.webName="螞蟻部落";
}
F.prototype={
  age:4,
  address:"青島市南區"
}
let f=new F();
console.log(f.__proto__==F.prototype);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/02/192650o96bx33tb9b6rx3n.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼返回值為true,分析如下:

(1).物件例項f的__proto__屬性指向它的建構函式的prototype原型物件。

(2).也就是說__proto__屬性擁有者身份是物件例項,它指向建立此物件例項的建構函式的原型物件,當然要辯證的看問題,比如建構函式F也具有__proto__屬性,因為它也是Function建構函式的例項。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
function F(){
  this.webName="螞蟻部落";
}
F.prototype={
  age:4,
  address:"青島市南區"
}
let f=new F();
console.log(f.hasOwnProperty("__proto__"));
console.log(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__"));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/02/192728ogm6mskngi6sik5g.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).f.hasOwnProperty("__proto__")返回false,說明此屬性是繼承自原型鏈,非自有屬性。

(2).__proto__是訪問器屬性,具體參閱JavaScript get set訪問器屬性一章節。

關於原型鏈上的訪問器屬性特點可以參閱原型鏈上的get與set訪問器屬性一章節。

最後說明:

(1).雖然__proto__屬性已經被標準化,但是並不推薦使用。

(2).推薦使用Object.getPrototypeOf方法與Object.setPrototypeOf方法替代。

(3).使用它設定原型物件,牽一髮動全身,同時設定物件的原型操作較為影響效能,應儘量避免類似操作。