在C++中,我最熟悉的语言,通常是一个声明这样的对象:
class foo
{
public:
int bar;
int getBar() { return bar; }
}
Run Code Online (Sandbox Code Playgroud)
调用getBar()工作正常(忽略bar可能未初始化的事实).内部的变量bar在getBar()类的范围内foo,所以我不需要说,this->bar除非我真的需要说清楚我指的是' bar而不是比如参数.
现在,我正试图在Javascript中开始使用OOP.所以,我查找如何定义类并尝试相同的事情:
function foo()
{
this.bar = 0;
this.getBar = function() { return bar; }
}
Run Code Online (Sandbox Code Playgroud)
它给了我bar is undefined.更改bar以this.bar解决问题,但为每个变量执行此操作会使我的代码变得非常混乱.这对每个变量都是必要的吗?由于我找不到与此有关的任何问题,这让我觉得我做的事情从根本上是错误的.
编辑:是的,所以,从评论我得到的是,this.bar一个对象的属性,引用不同于bar局部变量的东西.有人可以说,为什么这就是范围和对象,以及是否有另一种方法来定义一个没有必要的对象?
如果我的代码看起来像这样,使用var vs这个的首选方法是什么?
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
logMessage(a);
logMessage(self.b);
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,只要MyObject存在,var就会存活下来,所以这和使用它一样吗?
编辑:
为了更清楚地澄清这个问题,我只对从对象内部而不是从外部访问变量感兴趣.
我看到一些看起来像这样的代码:
function foo(bar) {
this.bar = bar;
};
Run Code Online (Sandbox Code Playgroud)
你可以像这样重写它:
function foo(bar) {
var bar = bar;
};
Run Code Online (Sandbox Code Playgroud)
因为那样你就不需要继续写this更好的了.这两行代码是否做同样的事情?
非常感谢.
当我尝试使用未声明的变量时,我得到ReferenceError:
console.log(a); // Uncaught ReferenceError: a is not defined\nRun Code Online (Sandbox Code Playgroud)\n我可以先使用一个变量,然后再定义它,这样 \xe2\x80\x99 就不会因为提升而成为问题。
\nconsole.log(a); // undefined\n\nvar a;\nRun Code Online (Sandbox Code Playgroud)\n但是当我声明一个对象时,为什么执行上下文允许我使用它的任何属性?
\nvar obj = {};\n\nconsole.log(obj.a); // undefined\nconsole.log(obj.why); // undefined\nRun Code Online (Sandbox Code Playgroud)\n为什么这些是允许的,并且a从未why在任何地方声明过?