2011-09-17 8 views
1

以下のコードでは、宣言された2つのオブジェクトがあり、1つのオブジェクトが別のオブジェクトのプロパティと関数を継承しています。関数のメソッドを返す

super変数を使用して、継承したオブジェクトのメソッドを呼び出す必要があります。私がitemEditorをトレースすると、関数とそのメソッドを正しく見ることができます。 itemEditorのメソッドにアクセスしようとすると、undefinedが返されます。

私は間違っていますか?これを行うより良い方法はありますか?

var myObject = {  
itemEditor : function (vars) { 

    this.editItem = function() { 
     alert("Editing Item"); 
    } 
}, 

recurringItemEditor : function (vars) { 
    myObject .itemEditor.apply(this, [vars]); 
    this.prototype = myObject.itemEditor.prototype; 
    var super = myObject.itemEditor 

    this.editItem = function() { 
     console.log("fn.recurringItemEditor.editItem"); 
     console.log(super); 
     console.log(super.editItem); 
     super.editItem.call(this); 
    } 
} 
+0

これは、JavaScriptに悪い名前を付けるようなコードです。 JSは実行時の注入を可能にするだけであるため、読みにくいように意図的にコードを設計する必要はありません。私はあなたがやろうとしていることを達成するエレガントな方法があると確信しています。きれいな紙で始めましょう。 – RHT

答えて

1

コードが少し混乱しているようです。一方では、myObject.itemEditorはコンストラクタであるため、関数(myObject.itemEditor.apply(this, [vars]))であり、プロトタイプ(this.prototype = myObject.itemEditor.prototype;)のオブジェクトのように扱われます。

これは、superが予約されていることを考慮していません。

あなたの例では、何かしようとしているものを単純化しているかもしれませんが、通常のプロトタイプ継承を使用しない理由はわかりません。そうすれば、ローカルインスタンスにメソッドを持ち、プロトタイプを呼び出すことができます。

recurringItemEditor : function (vars) { 
    this.prototype = new myObject.itemEditor(vars); 

    this.editItem = function() { 
     console.log("fn.recurringItemEditor.editItem"); 
     console.log(this.prototype); 
     console.log(this.prototype.editItem); 
     this.prototype.editItem.call(this); 
    } 
} 
0

私はあなたのアドバイスを使用して、今はうまくいきます。ファンクションとオブジェクトのように扱う点に関しては、オブジェクトがitemEditorのプロパティを継承するためにはまだmyObject .itemEditor.apply(this, [vars]);が必要でした。私は元のコードでそれを明確にすべきでした。これを行うより良い方法があれば教えてください。

var myObject = {  
    itemEditor : function (vars) { 
     var myVars = vars + "foo"; 

     this.editItem = function() { 
      alert(myVars); 
     } 
    }, 

    recurringItemEditor : function (vars) { 
     myObject .itemEditor.apply(this, [vars]); 
     this.prototype = new myObject.itemEditor(vars); 

     this.editItem = function() { 
      console.log("fn.recurringItemEditor.editItem"); 
      console.log(this.prototype); 
      console.log(this.prototype.editItem); 
      this.prototype.editItem.call(this); 
     } 
    } 
} 
+0

myObject.itemEditorをrecurringItemEditorオブジェクトのプロトタイプとして使用すると、すべてのプロトタイププロパティをオブジェクト上にあるかのように使用できるようになります。これがプロトタイプの継承です。あなたの現在の例では、 'myObject .itemEditor.apply(this、[vars]);'が必要な理由はわかりません。しかし、あなたのコードは、現代の一般的なJavascriptのようになります。私の答えを受け入れる? :) – andrewmu