2012-02-25 10 views
2

純粋なプロトタイプベースのJavaScriptを理解しようとしています。私が苦労しているのは、再利用(継承)です。Javascriptの再利用:このアプローチにはどんな副作用がありますか?

私のプロジェクトでは、この方法でオブジェクトを再利用できるようにしました。

// very generic prototype 
var Apparatus = (function(){ 
    var self = Object.create({}); 
    self.state = false; 
    self.on = function() { this.state = true; }; 
    return self; 
})(); 

// more specific prototype 
var Radio = (function(){ 
    var self = Object.create(Apparatus); 
    self.frequency = 0; 
    self.setFrequency = function(f) { this.frequency = f; } 
    self.getFrequency = function() { return this.frequency; } 
    return self; 
})(); 

私は、2つの異なる無線を作成し、ラジオのオブジェクトをコピー/「インスタンス化」します。

var kitchenRadio = Object.create(Radio); 
kitchenRadio.state = false; 
kitchenRadio.on(); 

var carRadio = Object.create(Radio); 
carRadio.state = false; 

console.log(kitchenRadio.state, carRadio.state); 
// true false 

これは動作しますが、それでも続きますか?誰もが望ましくない結果を予測することはできますか?

+1

これが望ましくないかどうかわかりませんが、 'Radio.on()'は 'kitchenRadio.state'を' true'に設定します。 – pimvdb

+0

したがって、私は特にそれを避けるために、kitchenRadioとcarRadioの両方で状態プロパティを作成する必要があります。アプローチを大幅に変更することなくこれを修正できますか? –

+1

私は、関数は継承されるべきであるが、 'state'のようなプロパティは継承されるべきではないと考えます。すべてのラジオは一般的な方法でオンになっていますが、各ラジオは独自の状態を持っています。したがって、各最終インスタンスは独自のプロパティを持ち、関数は継承されます。 – pimvdb

答えて

2

@pimvdbのように、状態を削除してもうまくいきます。

// very generic prototype 
var Apparatus = (function(){ 
    var self = Object.create({}); 
    self.on = function() { this.state = true; }; 
    return self; 
})(); 

// more specific prototype 
var Radio = (function(){ 
    var self = Object.create(Apparatus); 
    self.setFrequency = function(f) { this.frequency = f; } 
    self.getFrequency = function() { return this.frequency; } 
    return self; 
})(); 

次に、Object.create(Object, params)を使用してインスタンス化します。

関連する問題