【发布时间】:2011-06-10 23:08:24
【问题描述】:
考虑以下代码:
function Dog()
{
this.foo = function() {};
this.walk = function()
{
if(canWalk())
{
alert('walking');
return;
}
alert('I have no legs!');
}
canWalk = function()
{
this.foo();
return false;
}
}
var instance = new Dog();
instance.walk();
假设this 指针指向Dog 的实例,该代码中的“特权”canWalk() 方法存在错误。它实际上似乎指向了让我感到困惑的全局对象!我读过,由于闭包,我可以在构造函数的范围内获取对 this 的引用,然后在我的“特权”方法中使用该引用,但这似乎是一种 hack。
我只是勉强掌握this 指针在各种上下文中的行为。我了解“附加”到对象的方法将收到指向附加对象的this。例如,foo.doStuff() 将有一个 this 指向 foo 实例。
令人不安的是,虽然我认为我很聪明并在我的 OBJECT 上创建了“特权”方法,但似乎我实际上是在将函数转储到全局范围内!也许有一个名为 init() 的全局方法(很可能)来自另一个库或文件,而不是我自己创建的。如果我随后用名为init() 的“特权”方法定义了一个漂亮的小封装对象,我将替换另一个全局init() 方法。
我的问题是,创建“特权”方法(以及与此相关的字段)的最佳实践是什么?我的示例对象还有哪些其他方法可以提供私有或特权方法,同时也具有适当的范围。我不是在寻找满足要求的晦涩解决方案,而是在寻找最佳实践。
【问题讨论】:
-
我不知道如何编辑我的原始帖子,但我意识到我犯了一个不幸的错误并且没有粘贴正确的示例代码。 canWalk() 方法调用了“foo”方法,所以基本上 canWalk() 调用了 this.foo()。很抱歉造成混乱
-
啊,我明白了。在那种情况下,
this可能指向了canWalk函数。在我的示例中,如果您使用self.foo就可以了。而且某处可能有一个编辑按钮:) -
@Steve 您可以通过单击文本左下角蓝色标签下方的“编辑”来编辑您自己的帖子。我尝试用您描述的内容更新代码,但有点不清楚。
-
我认为这就是他所说的:jsfiddle.net/3aMwb 我相信这说明了问题。
-
@Erik 感谢您的尝试,我很感激。我单击编辑,它会弹出两个版本的比较 - 我实际上无法编辑文本。我已尝试注销并重新登录,结果相同。
标签: javascript javascript-framework