2013-09-26 370 views
0

下面是在JavaScript中兩個被廣泛看作代碼片段:這些是什麼意思?

Function.prototype.method = function (name, func) { 
     this.prototype[name] = func; 
     return this; 
}; 

Number.method('integer', function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
}); 

很明顯,在第二個片段的this代表的是調用了增強integer方法Number對象。第一個片段中的this怎麼樣?從prototype屬性我們可以猜到它代表了正在增強的構造函數,但片段背後的邏輯對我來說是難以捉摸的。任何人都可以詳細解釋?謝謝。

+0

'this'可以表示任何東西,尤其是當函數被underscore.js的'bind'和'bindAll'祕密綁定時,所以答案從來就不是這樣。然而,[這裏](http://www.quirksmode.org/js/this.html)是一個高級參考。 – Brian

+0

請參閱我對這個其他問題的回答,以瞭解「this」在javascript中的行爲。這不像大多數其他語言:http://stackoverflow.com/questions/13441307/how-does-the-this-keyword-in-javascript-act-within-an-object-literal/13441628#13441628 – slebetman

回答

0

作爲方法調用的任何函數內的this值始終是該方法被調用的對象。所以在Number.method()中,它將是Number的構造函數。

它的行爲在完全相同的方式,當你調用任何其他對象的方法,如:

var obj = { 
    someMethod : function() { 
     console.log(this); 
    } 
} 
obj.someMethod(); // logs obj 

上面的例子之間的唯一區別和你的是,這裏的方法是在對象本身上找到,而在你的例子中,它是通過查找原型鏈找到的。

+0

感謝您指出出'Number.method()'只是一個方法調用,因此適用'this'最簡單的規則。 – lcn

0

method方法中,this將參考該方法所要求的對象Function。在這個例子中,它將是對Number函數的引用。

由於Number是一個內置的類,您可以使用new關鍵字創建它,它實際上是一個函數,這就是爲什麼Function原型適用於它。

2

Function是全局對象,所有功能使用,隨便怎麼樣Number全局對象。它們可以用作構造函數,但也適用於文字,即new Function();function() {}都與Function有關。

The prototype對象是一個構造函數的地方,您可以爲該構造函數創建的所有實例定義屬性和方法。構造函數是功能的JavaScript功能對象

方法功能,通常描述一個其是對象屬性的另一個名稱。

因此在Function.prototype上設置方法意味着每個函數都繼承該方法。

因此,如果援引爲Foo.prototype.bar()

  • 一個實例的Foo在方法barthis上構造FooFoo.prototype.bar)的prototype等於

    • Foo.prototype一個,如果從該實例調用,例如zvar z = new Foo(); z.bar();不管你定義this
    • 要使用callapplybind
    • 全局對象調用,如果沒有上下文,即var b = Foo.prototype.bar; b();

    在你的代碼,this有望成爲第二因爲Number函數,因爲它是構造函數,因此是的實例210。