gpt4 book ai didi

javascript - 子类访问父类的闭包变量

转载 作者:行者123 更新时间:2023-11-29 18:26:46 24 4
gpt4 key购买 nike

我正在为我当前的项目使用 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,它可以访问 p。但是,如果我覆盖 bar.getp

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

现在当我执行 bar.getp() 时,它会抛出 p is undefined 因为它不能被 bar 访问

我有几种方法可以让 bar 访问 p,但我认为它们有点笨拙,您认为这是实现此目的最干净的方法。

最佳答案

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

JavaScript 并不真正适合“私有(private)变量”。通常,开发人员要么在不需要继承时使用闭包作用域变量,要么在需要继承时使用某种约定,例如添加下划线,如下所示:

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

然后你可以毫无困难地进行子类化:

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

现在,我还应该注意到,您的示例非常人为设计,并且设计的方式有点毫无意义。我的意思是,为什么要用同样只返回 p 的东西覆盖 getp()?如果您的意图是实际创建一个私有(private)的静态属性 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.
}
});

希望对您有所帮助!

关于javascript - 子类访问父类的闭包变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12344967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com