javascript的Mixin继承模式失去了Closure特性

Mixin inheritance pattern of javascript lose Closure feature

本文关键字:Closure 特性 失去 模式 Mixin 继承 javascript      更新时间:2023-09-26

总之,我知道定义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一样利用TChildField的构造函数的参数jData。我知道我可以定义this.Data=jData,这样我就可以在TChildField.prototype.render中使用它,但我不想把它作为一个属性。最糟糕的是失去了Closure的好处,有办法做到吗?还是我不知道的?谢谢。

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