2012-11-05 57 views
2

我正在從事一個涉及從其他函數構造函數的項目。我有寫作課程來簡化事情的想法,但是我沒有使用__proto__就無法使用它。自定義函數類

這裏基本上是我的理想是什麼。

function MyFunction() { 
    // ... 
} 
var myFn = new MyFunction(); 
myFn(); // executes without error 
myFn instanceof MyFunction; // returns true 

下面的代碼不會只是使用__proto__

function MyFunction() { 
    var fn = function() { return 'hello'; }; 
    fn.__proto__ = this; 
    return fn; 
} 
var myFn = new MyFunction(); 
alert(myFn()); // hello 
alert(myFn instanceof MyFunction); // true 

這裏的東西我一直在使用valueOf

function MyFunction() { 
    this.fn = function() { return 'hello'; }; 
    this.valueOf = function() { return this.fn; }; 
} 
var myFn = new MyFunction(); 
alert(myFn instanceof MyFunction); // true 
alert(myFn.valueOf()()); // hello 
alert(myFn()); // error 

試着和這裏的其他東西延伸到包含的所有屬性的功能MyFunction。我不想使用__proto__,因爲它不是標準的。此外,這是一個怪胎的想法,我真的想讓它工作,但如果這是不可能的,我會活下去。但我想我的問題是,我想做什麼?

回答

2

奇妙的想法。我不相信你可以用標準的ECMAScript來完成它,甚至不使用ES5。

ES5使我們能夠更好地訪問和控制原型,包括提供設置創建對象(而不必通過構造函數)與Object.create時原型的一種手段,但你不能經由構建功能機制。這就是你需要做的事情,因爲instanceof使用抽象規格[[HasInstance]]方法,目前只能通過函數實現,而function implementation of it通過查看對象的解除原型([[Proto]])是否爲===到函數的prototype屬性來工作。設置對象的基礎原型的唯一標準方式是通過new MyFunction或通過Object.create來創建它,也不機制創建了一個函數對象。

ES.next可以使這成爲可能。還有一個已經晉升爲「和諧」狀態(所以,相當先進)爲「set prototype operator」,<|,其目的是解決許多當前通過__proto__解決的問題的提案。其中一件事情是「將函數的原型設置爲Function.prototype以外的其他東西」。使用它(目前的形式),你MyFunction會是這個樣子:

function MyFunction() { 
    return MyFunction.prototype <| function() { return 'hello'; }; 
} 
MyFunction.prototype = Object.create(Function.prototype); 

最後一點是要使其成爲MyFunction.prototype與原型Function.prototype的對象,這樣通過MyFunction構造函數有callapplybind

+0

無賴,我也聽到了某種形式的'__proto__'將在未來ES正式加入了。我想我只是在我的時間之前:(噢,好吧。 – SpaceFace