2013-06-26 34 views
3

我一直在閱讀關於javascript原型鏈接,據我所知,有一個全球Object.prototype這是其他原型的基礎,如Array.prototype,它可以作爲基礎另一個原型。就像基於類的OOP中的繼承一樣。沒關係。javascript原型鏈接 - 得到父母的父母

現在,我想檢查和比較不同對象的原型。如果Array的原型是基於Object.prototype的,我猜應該可以使用類似Array.prototype.prototype的東西。但它未定義:

> Array.prototype.prototype 
undefined 

當我鍵入__proto__,而不是prototype,我得到:

> Array.__proto__ 
[Function: Empty] 
> Object.__proto__ 
[Function: Empty] 
> Array.__proto__.__proto__ 
{} 

(控制檯輸出從拍攝的NodeJS)。我有以下問題:

  • 如何訪問原型的「父級原型」?
  • prototype__proto__有何區別?

回答

4

我相信你正在尋找:

Object.getPrototypeOf(Array.prototype); 
// The same as Object.prototype 

(這是一個ES5功能,not compatible with some older browsers)。

什麼原型之間的差異,__proto__

prototype屬性始終屬於一個構造函數(如ObjectArray和自定義構造函數)。 __proto__屬性存在於使用這種構造函數創建的實例上,並指向與constructor.prototype相同的對象。

例如:

function MyClass(){} 
var myObj = new MyClass(); 
myObj.__proto__ === MyClass.prototype; // true 

在你給的例子,Array.__proto__實際上是構造函數的原型對象 - 而不是它的prototype屬性。這就是爲什麼它是[Function: Empty],因爲Array是一個函數,是默認構造函數的一個實例。一些特定的陣列實例的__proto__相同Array.prototype

​​
+0

不完全。 'Array.prototype'本身是「*與某個數組實例的'__proto__'相同*」,而不是它的原型。 – Bergi

+0

@Bergi如果這是關於我的第一個代碼塊的評論,那麼你是對的。刪除。 – bfavaretto