【发布时间】:2015-04-04 16:16:26
【问题描述】:
我试图在嵌套函数中使用函数的属性,但我不知道如何,没有传递父函数。
示例:
function foo() {
this.baz = 'baz'
this.bar = new bar()
}
function bar() {
this.bla = 'bla'
}
bar.prototype.func = function() {
console.log(...) // this should return 'baz' (attr baz of foo())
}
到目前为止,我尝试过这个:
function foo() {
this.baz = 'baz'
this.bar = new bar(this)
}
function bar(foo) {
this.bla = 'bla'
this.foo = foo
}
bar.prototype.func = function() {
console.log(this.foo.baz)
}
有没有一个好的模式来完成这个?因为我的解决方法是一团糟
编辑:
因为你们中的一些人想要一个更真实的例子:
function Game() {
this.world = {
x: 200,
y: 300
}
this.players = {
one: new Player()
two: new Player()
}
}
function Player() {
this.size = {x:1,y:2}
this.position = {
x: world.x - this.size.x, // i need to access games world attribute
y: 0
}
}
但这不是我在 Player 类中需要的 Game 类的唯一属性..
【问题讨论】:
-
这似乎是关于 JavaScript 作用域如何工作的一半问题和关于继承如何工作的一半问题。也许如果您提供更多现实生活中的示例,我们可以就good 方法提出更好的建议来做您想做的事情。就目前而言,我的回应是“只需将
foo引用传递给bar。 -
在您的示例中,
bar不继承自foo。bar上没有可以访问foo属性的原型属性。您在第一个示例中所做的可能相当于依赖注入,但没有任何继承。关于第二个例子,也没有继承,但是你使用bar作为foo的装饰器,所以你可以做this.foo.baz。这对于装饰器的这种实现是完全有效的。 -
我支持@brianvaughn - 目前看起来不错,但可能并不取决于实际需要,而且确实有更好的方法。
-
我同意@brianvaughn 关于需要一个真实生活例子的观点。当前的问题没有解释您要做什么。如果您想在
bar中使用baz,您可以在第二个sn-p 中使用它,或者您可以将foo实例化,您在bar中执行的所有操作都可以使用this.method,而是使用@987654338 @来自foo。上帝,我讨厌这些无处不在的虚拟变量名。 -
感谢您的 cmets.. 我添加了一个真实的例子
标签: javascript function class inheritance