2012-05-15 96 views
3

我只是好奇我是否可以將一個對象包含到函數原型鏈中。我的意思是:函數的自定義原型鏈

var test = function() { return 'a'; }; 

console.log(test.bind(this)); // return new bound function 

// changing the prototype 
// in console the prototype is really set as needed 
// test => new object => function prototype => Object prototype 
var F = function() {}; 
F.prototype = Function.prototype; 
test.prototype = new F(); 

console.log(test.bind()); // this still works and returns new bound function 

test.prototype.bind = function() { 
    return 'test'; 
}; 

console.log(test.bind()); // this does not work as expected -> returns new bound function instead of 'test'. When I do delete Function.prototype.bind, then console.log(test.bind) returns undefined 
+1

'test.prototype.bind'增加了一個方法來test',即'新的測試()。bind'的'實例。它沒有定義'test.bind'。在第一種情況下,'test.bind'直接從'Function.prototype'繼承,而不是'test.prototype'。 –

+0

就我所見,不可能在不修改'Function.prototype'的情況下將自定義方法添加到函數原型鏈中? –

回答

2

你有一個功能test。它是instanceof Function,並且從Function.prototype繼承,因此您可以撥打test.bind作爲示例。

然後你你的函數的「原型」屬性設置爲一個對象從Function.prototype繼承。這意味着test所有實例將從該物體(和Function.prototype的)繼承:

var t = new test; 
t instanceof test; // => true 
t instanceof Function; // => true 

然後你覆蓋您的自定義原型對象的測試性能。你做的好做,因爲功能的方法應該只在函數被調用(即調用對象):

>>> Function.prototype.bind.call({}) 
Unhandled Error: Function.prototype.bind: this object not callable 

console.log你的測試只適用於你的test功能功能的方法,而不是它的實例。好,因爲他們會失敗。因此,我看不到任何對象應該從Function繼承的原因 - 您不能構建不直接從Function繼承的函數。

+0

感謝您的完整解釋。至於我不想擴展函數原型,我將使用一些代理類,儘管它不會那麼優雅... =( –