2011-09-29 32 views
2

我們有一組創建的類,這些類依賴於Prototype的Class實現(以及一些Object.extend)。Replacement for Prototype.js Class系統

問題是原型正在與其他應用程序(即使使用「noconflict」適配器等)集成時產生麻煩。

是否有人知道兼容的Class實現不會混淆全局範圍?或者有人能夠「提取」Prototype來單獨使用它嗎?

回答

4

wrote one幾年回來(我應該去重新審視它,並給它一個合適的名字),因爲我不喜歡,呼籲「超」,其中涉及創建函數中的每條方法的原型的處理一次重寫的方法被調用(是的,真的)。除了你如何製作超級調用之外,它與Prototype非常相似;您可以隨時將其放入並在您的代碼中搜索super並更改它。我的實現也使它更容易使用named functions rather than anonymous ones,這很有用,原因很多,尤其是因爲它可以幫助您的工具幫助您。它也使得私人的「班級」方法變得微不足道。下面的細節。

但你不必使用我的。有跡象表明,需要稍微更多的工作來遷移你的代碼的其他選項,但可能不是多了很多:

我有兩個問題他們使用函數反編譯(Prototype的Class的東西)和函數反編譯(例如,在函數上調用toString)從未標準化,並且在某些移動瀏覽器上不起作用。如果函數反編譯不起作用,Resig的機制將繼續工作,但它會增加此種情況下的每種方法的開銷(而不僅僅是超級調用的方法)。我的機制根本不使用函數反編譯,增加了沒有開銷的方法調用,甚至使超級調用高效。

如果你用我的機制,你的原型代碼如下所示:

var SuperThingy = Class.create({ 
    foo: function(arg) { 
     console.log("SuperThingy: " + arg); 
     this._pseudoPrivate(); 
    }, 
    _pseudoPrivate: function() { 
     console.log("I'm not really private."); 
    } 
}); 
var Thingy = Class.create(SuperThingy, { 
    foo: function(super, arg) { 
     console.log("Thingy: " + arg); 
     super(arg); 
    } 
}); 

您可以最小的變化:

var SuperThingy = Helper.makeClass({ 
    foo: function(arg) { 
     console.log("SuperThingy: " + arg); 
     this._pseudoPrivate(); 
    }, 
    _pseudoPrivate: function() { 
     console.log("I'm not really private."); 
    } 
}); 
var Thingy = Helper.makeClass(SuperThingy, { 
    foo: function(arg) { 
     console.log("Thingy: " + arg); 
     this.callSuper(arguments, arg); 
    } 
}); 

...或者你可以稍大的變化並獲得(callSuper使用arguments.callee,這是),正確命名的函數(用於調試等)和真正的私有函數:

var SuperThingy = Helper.makeClass(function() { 
    function SuperThingy_foo(arg) { 
     console.log("SuperThingy: " + arg); 
     trulyPrivate.call(this); 
    } 

    function trulyPrivate() { 
     console.log("I'm truly private."); 
    } 

    return {foo: SuperThingy_foo}; 
}); 
var Thingy = Helper.makeClass(SuperThingy, function() { 
    function Thingy_foo(arg) { 
     console.log("Thingy: " + arg); 
     foo.$super.call(this, arg); 
    } 

    return {foo: Thingy_foo}; 
}); 
0

在試用ComposeJS之後,我找不到明確調用超類構造函數的方法(它們會自動調用),所以我不得不放棄它。我終於在JsFace上解決了這個問題,它有許多特性(繼承,mixins,靜態屬性,AOP),儘管調用超類構造函數的語法有些奇怪:this。$ class。$ super.call(args)。根據它的網站和這個benchmark,它似乎也是最快的實施,完全吹走了Resig實施,這很慢。需要注意的是需要注意的是,這個$類$超級始終是超階級的最終子類,所以你可能需要做這樣的事情:。

var C = Class(A, { 
 
    constructor: function (x) { 
 
    C.$super.call(this, x); 
 
    }, 
 
    ... 
 
}

而不是

var C = Class(A, { 
 
    constructor: function (x) { 
 
    this.$class.$super.call(this, x); 
 
    }, 
 
    ... 
 
}

這就好比例子,如果你有多層次的繼承,否則你會得到無限的遞歸。