2011-05-11 51 views

回答

4

並非所有功能都是通過Function構造函數創建的。 instanceof特別檢查是否給定項目是由創建的那個特定函數

在處理多個窗口時,您會在瀏覽器環境中獲得類似的效果。我的意思是,如果你在窗口中的具有功能foo

function foo(arg) { 
    if (arg instanceof Array) { 
     // It's an array, do something 
    } 
} 

...你在有代碼另一個窗口 B中調用它:

opener.foo([]); 

...那麼你預計foo認識到arg是一個數組,對吧?但它沒有,因爲雖然arg一個數組,它不是在foo是在窗口中Array構造函數創建

更多搞清楚事情是什麼在這裏:Say what?

如果你對這些東西感興趣(就像你看起來那樣),沒有什麼比閱讀the specification更好。是的,散文是......乾的......而術語是......密集的......但隨着你越來越瞭解潛在的運作,它變得越來越有趣。


題外話:當心__proto__是非標準的,而不是由所有的JavaScript實現的支持。

+0

+1 - 「說什麼?」鏈接是一個很好的資源。很好,很簡潔。 – McStretch 2011-05-11 12:53:49

+0

@McStretch:乾杯! – 2011-05-11 13:02:38

+0

哈哈,我剛剛意識到這是你的博客。祝賀你! – McStretch 2011-05-11 13:09:15

2
alert(Object.__proto__); // clearly Object.__proto__ is a function right? 
alert(typeof Object.__proto__); // clearly Object.__proto__ is a function right? 
alert(Object.__proto__ instanceof Function); // ! 

沒錯,它是一個函數。但是,它不是一個功能對象。這就是爲什麼instanceof返回false。你可以閱讀所有關於instanceof here

+2

*「但是,它不是一個函數對象。」*它可能是一個函數對象(實際上它可能是)。只是不是通過特定的'Function'構造函數創建的。 – 2011-05-11 12:16:06

3

爲了與神祕的結尾:

到底是什麼Object.__proto__

  • 它只是對Function.prototype對象的引用。

    Object.__proto__ === Function.prototype; // true 
    

Object構造函數幾乎所有的內置和用戶定義的函數,從Function.prototype繼承。

這個對象(Function.prototype)是described in the specification成爲Function對象,但很明顯,對象不能從自身繼承,這就是爲什麼它Object.protoype,而不是繼承。

您的測試:

Object.__proto__ instanceof Function; // false, which is equivalent to: 
Function.prototype instanceof Function; // false 

簡直是在告訴我們,Function.prototype對象原型鏈的Function.prototype本身

Function.prototype.isPrototypeOf(Function.prototype); // false, equivalent to: 
Object.prototype.isPrototypeOf.call(Function.prototype, Function.prototype); 

正如我之前說,in the specification這對象描述具有以下特徵,如果您有興趣:

  • 它是一個函數對象(實現[[Call]]內部方法)。

    typeof Function.prototype; // "function" 
    
  • [[Class]]內部屬性的值是"Function"

    Object.prototype.toString.call(Function.prototype); // "[object Function]" 
    
  • [[Prototype]]內部屬性點來Object.prototype值(如你現在知道)。

    Object.prototype.isPrototypeOf(Function.prototype); // true 
    
  • 可以用任意數量的參數調用。

  • 它始終返回undefined值。

  • length財產是0

  • [[Extensible]]內部財產的初始值爲true

相關問題