所有,我都知道定义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知道jData在被调用时的值是什么,这是因为Closure的特性。

但是现在我只是尝试在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的好处,有什么办法可以做到吗?还是我不知道的东西?

最佳答案

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

09-20 16:28