2011-09-17 31 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