2011-09-17 100 views
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

我用你的建議,它現在運作良好。關於將它當作一個函數和一個對象來處理,myObject .itemEditor.apply(this, [vars]);仍然是必需的,以便對象繼承itemEditor的屬性。我應該在原始代碼中明確表達。如果有更好的方法來做到這一點,讓我知道。

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