2012-01-02 4 views
3

私はJavascriptで熟練していません。私はいくつかのJSコードのためにクラスを定義する関数を使って(hereのように)操作ページを開発しました。このクラスは非常に複雑で、オブジェクトの位置を計算するのに役立ちます。これは現在テストされ運用されています。Javascriptの実装dilemna:メソッドオーバーライドのソリューションを持つクラスを探しています

私は新しいページを作成しています。私はこのクラスを再利用したいと思います。しかし、このクラスの少なくとも1つのメソッドは、各ページの(Javaのように)オーバーライドする必要があります。私は別のSOの質問では、Javascriptでメソッドをオーバーライドすることはできませんを読んでいる。

私はクラスプロトタイプを変更することを考えていましたが、そうすると、すべてのクラスインスタンスが変更されます。

各ページのクラスコードを複製することを非常に嫌っています。この問題にうってつけの優雅な解決策がありますか?ありがとう。

ソリューション

ので、考慮に解決サイムVIDAS'アダムRackisの上部にコメントを取る:

function Base(){} 
Base.prototype.foo = function() { alert("base"); }; 

function Derived() {} 

Derived.prototype = Object.create(Base.prototype); 
Derived.prototype.foo = function() { alert("overridden"); }; 


var b = new Base(); 
var d = new Derived(); 

b.foo(); 
d.foo(); 

参照:http://jsfiddle.net/8Gq7C/

+0

あなたは、両方のアルゴリズムは、引数に基づいて、そのメソッドの内部に存在し、そして持って使用すべきアルゴリズムを決めることができました... –

+0

@ŠimeVidasは彼がどこで話しているかを知っています。彼の提案を取ることは良い考えです。 Object、createは古いブラウザではサポートされていないので、[ここ](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Object/create)からshimを取得する必要があります。あなたは古いIE –

答えて

4

をあなたはJavascriptソートの関数をオーバーロードすることができますの。オーバーロードしたいメソッドを持つ関数を継承する新しい関数コンストラクターを作成し、派生した関数のプロトタイプのメソッドを変更します。

それはこのようになります:

function Base(){} 
Base.prototype.foo = function() { alert("base"); }; 

function Derived() {} 

//Derived.prototype = new Base(); //not ideal - see the comments 
Derived.prototype = Object.create(Base.prototype); //grab MDN shim for older IE 
Derived.prototype.constructor = Derived; 

Derived.prototype.foo = function() { alert("overridden"); }; 

var b = new Base(); 
var d = new Derived(); 

b.foo(); 
d.foo(); 

LIVE DEMO

+0

をサポートしたい場合は、Javascriptではベースとは何の関係もなく、Derivedでインスタンシエーションを定義できますか?ああ...それは笑いを傷つける! – JVerstry

+0

'Derived.prototype = Object.create(Base);'が必要です。あなたの現在の方法に欠陥があります。 (ES5-shim、あなたが言及した場合) –

+0

デモをありがとう、それはまさに私が必要とするものです... – JVerstry

関連する問題