2

总之,我知道定义 javascript OOP 对象的传统方式。这是示例。

var TField=function(jData)
{
   this.id=jData.id;
   this.name=jData.name;
   this.attributes=jData.attributes;
   TField.prototype.render=function(){
      alert(jData.id);
   };
};

我们可以发现无论何时调用它都TField.prototype.render知道它的值是多少,这是因为.jDataClosure

但现在我只是尝试在 javascript 中实现继承。我发现推荐的方式是Mixin pattern. 这是我到目前为止所做的代码。

TChildField.prototype.render=function(){
      alert('TChildField render.');
      //Can not utilize the parameters of the constructor. like jData
};


var TField=function(jData)
{
   this.id=jData.id;
   this.name=jData.name;
   this.attributes=jData.attributes;

};

TField.prototype.render=function(){
      alert('TField render.');
};

var TChildField=function(jData)
{
    TField.call(this,jData)
}

var tobj={id:"1",name:"test",attribute:{}};
TChildField.prototype=Object.create(TField.prototype)
TChildField.prototype.render=function(){
      alert('TChildField render.');
};
var c= new TChildField(tobj);
alert(c.id);
alert(c.name);

好吧,它工作正常没有问题。但是我的问题是我发现我不能像TField一样jData使用构造函数的参数。TChildField我知道我可以定义this.Data=jData以便我可以在 中使用它TChildField.prototype.render,但我不希望它作为一个属性。而最糟糕的是失去了利益Closure,有什么办法可以做到吗?或者我不知道的东西?谢谢。

4

1 回答 1

1

你需要这个封装做什么?设置有什么问题this.Data=jData?这很简单,它可以解决您的问题。为什么最糟糕的事情是失去关闭的好处?实际上应该避免闭包,因为它们可能会导致非常奇怪的问题(内存泄漏?)。

于 2013-04-08T11:08:07.047 回答