子类访问父类's闭包变量
subclass accessing parent's closure variable
我正在为我的当前项目使用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;
}
});
相关文章:
- 子类访问父类's闭包变量
- 构造函数函数闭包变量
- 如何冻结函数's在闭包中的变量
- 使变量可用于不带闭包的异步调用
- 局部变量在闭包中丢失
- 其中是闭包中存储的变量-堆栈或堆
- javascript闭包:保护内部变量
- Javascript:附加字符串中的事件,闭包中的变量求值
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- JavaScript闭包和变量引用
- Javascript分析之谜 - 闭包变量
- 对闭包变量的更改是否在使用闭包的回调中可见
- 使用object.assign()添加到对象中的getter发现闭包变量的值错误
- Javascript:为什么对闭包变量的访问可能很慢
- 模块中未更新Nodejs闭包变量
- node.js捕获闭包变量
- Javascript中绑定闭包变量
- 函数外部的Javascript闭包变量访问
- 回调函数访问闭包变量
- 为什么我的闭包变量在使用$后被清除.每个都使用JSON数据