子类访问父类's闭包变量

subclass accessing parent's closure variable

本文关键字:闭包 变量 访问 父类 子类      更新时间:2023-09-26

我正在为我的当前项目使用John Resig的继承实现,我想知道是否有一种方法可以让子类也继承(访问)父类的闭包变量。。。

例如,我编写以下类

var Foo = (function() {  
  var p = "im p";
  var Foo = Class.extend({  
    getp : function() {
       return p;
    }
  });
  return Foo;
})();

现在Foo类可以访问闭包中的变量p。Foo的子类也是。。。

var Bar = Foo.extend({});  
var bar = new Bar;
bar.getp(); // "im p"

这并不奇怪,因为bar.getp只是调用Foo.getp,Foo.getp可以访问p。但是,如果我覆盖bar.getp

var Bar = Foo.extend({
  getp : function() {
    return p;
  }
});

现在,当我执行bar.getp()时,它将抛出未定义的p,因为bar 无法访问它

我有几种方法可以让p进入酒吧,但我认为它们有点尴尬,你认为这是最干净的方法。

闭包范围由定义函数时范围内的任何内容组成。在这种情况下,当定义第一个getp时,p在范围内,但当定义第二个getp时不在范围内。所以你不能引用p。事实上,您可能已经发现,第一个getp方法引用的p实际上对所有Foo对象(及其子类)都是通用的。

JavaScript并不能很好地适应"私有变量"。通常,当不需要继承时,开发人员最终会使用闭包范围的变量,或者当需要继承时使用某种约定,例如添加下划线,如下所示:

var Foo = Class.extend({  
    _p : "i'm p",
    getp : function() {
        return this._p;
    }
 });

然后你可以毫无困难地划分子类:

var Bar = Foo.extend({  
    getp : function() {
        return this._p;
    }
});

现在,我还应该注意到,你的例子很做作,而且有点毫无意义。我的意思是,为什么要用同样只返回p的东西来覆盖getp()?如果您的意图是实际创建一个私有的静态属性p,那么您所拥有的应该可以正常工作。如果您想在子类中访问p,您应该只使用您可以访问的getp方法,如下所示:

var Bar = Foo.extend({  
    getpete : function() {
        return Foo.getp() + "ete"; 
        //You can also use this.getp() if you want, there's no difference.
    }
});

希望能有所帮助!

p变量仅在自执行匿名Foo函数的范围内定义,因此无法检索。

可以将其视为私有成员,它也只能在声明的类中使用。

如果你只需要检索它-你可以做:

var Bar = Foo.extend({
  getp : function() {
    var p = Foo.prototype.getp.call(this);
    return p;
  }
});