Javascript:我需要为对象中的每个变量放置this.var吗?

在C语言中,我最喜欢的语言通常是这样声明一个对象:

class foo
{
public:
    int bar;
    int getBar() { return bar; }
}

调用getBar()工作正常(忽略可能未初始化该条的事实)。 getBar()中的变量栏在foo类的范围内,所以我不需要说这个 – > bar,除非我真的需要明确指出,我指的是类’bar而不是说,一个参数。

现在,我试图在Javascript中开始使用OOP。所以,我查找如何定义类并尝试同样的事情:

function foo()
{
     this.bar = 0;
     this.getBar = function() { return bar; }
}

它给我的酒吧是未定义的。将条更改为this.bar可以解决问题,但是为每个变量执行这个操作会使我的代码很麻烦。每个变量都是必需的吗?既然我找不到任何有关这个问题的问题,那就让我觉得我做错了事情。

编辑:对,所以,从评论我得到的是this.bar,一个对象的属性,引用与bar不同的局部变量。有人会说出这样的原因,就范围和对象而言,如果还有另一种方法来定义一个不需要的对象呢?

JavaScript没有类基于类的对象模型。它使用更强大的原型继承,可以模仿类,但不适合它。一切都是一个对象,对象可以从其他对象继承。

构造函数只是将属性分配给新创建的对象的函数。该对象(由具有new keyword的调用创建)可以通过this keyword(该功能的本地)引用。

一种方法也只是一个在对象上调用的函数 – 再次指向对象。至少当该函数作为对象的属性调用时,使用member operator(点,括号)。这会对新手造成很多困惑,因为如果你绕过这个功能(例如传递到一个事件监听器),那么它将被访问的对象“分离”。

现在遗产在哪里? “类”的实例从同一原型对象继承。方法被定义为该对象的函数属性(而不是每个实例的一个函数),您调用它们的实例只是继承该属性。

例:

function Foo() {
    this.bar = "foo"; // creating a property on the instance
}
Foo.prototype.foo = 0; // of course you also can define other values to inherit
Foo.prototype.getBar = function() {
    // quite useless
    return this.bar;
}

var foo = new Foo; // creates an object which inherits from Foo.prototype,
                   // applies the Foo constructor on it and assigns it to the var
foo.getBar(); // "foo" - the inherited function is applied on the object and
              // returns its "bar" property
foo.bar; // "foo" - we could have done this easier.
foo[foo.bar]; // 0 - access the "foo" property, which is inherited
foo.foo = 1;  // and now overwrite it by creating an own property of foo
foo[foo.getBar()]; // 1 - gets the overwritten property value. Notice that
(new Foo).foo;     // is still 0

所以,我们只使用该对象的属性,并且很高兴。但所有这些都是“公开的”,可以被覆盖/改变/删除!如果没关系,你很幸运。您可以通过使用下划线将其名称前缀来表示属性的“私有性”,但这只是其他开发人员的一个提示,可能不会被遵守(尤其是错误)。

所以,聪明的头脑已经找到一个使用构造函数作为闭包的解决方案,允许创建私有的“属性”。每个执行javascript函数都会为本地变量创建一个新的变量环境,一旦执行完成,就可能会收到垃圾回收。在该范围内声明的每个函数也可以访问这些变量,只要可以调用这些函数(例如,由事件侦听器),环境必须持续存在。因此,通过从构造函数导出本地定义的函数,您可以使用只能由这些函数访问的本地变量来保留该变量环境。

让我们看看它在行动:

function Foo() {
    var bar = "foo"; // a local variable
    this.getBar = function getter() {
        return bar; // accesses the local variable
    }; // the assignment to a property makes it available to outside
}

var foo = new Foo; // an object with one method, inheriting from a [currently] empty prototype
foo.getBar(); // "foo" - receives us the value of the "bar" variable in the constructor

此getter函数在构造函数中定义,现在称为“特权方法”,因为它可以访问“私有”(本地)“属性”(变量)。 bar的值不会改变。你也可以为它声明一个setter函数,当然也可以添加一些验证等

请注意,原型对象上的方法无法访问构造函数的局部变量,但它们可能会使用特权方法。我们加一个:

Foo.prototype.getFooBar = function() {
    return this.getBar() + "bar"; // access the "getBar" function on "this" instance
}
// the inheritance is dynamic, so we can use it on our existing foo object
foo.getFooBar(); // "foobar" - concatenated the "bar" value with a custom suffix

所以,你可以结合这两种方法。请注意,特权方法需要更多的内存,因为您创建具有不同作用域链(但是相同的代码)的不同的函数对象。如果要创建非常大量的实例,您应该仅在原型上定义方法。

当你从一个“类”到另一个“类”设置继承时,它变得更复杂一些 – 基本上你必须使得子代原型对象从父类继承,并且在子实例上应用父构造函数来创建“私有属性“。看看Correct javascript inheritancePrivate variables in inherited prototypesDefine Private field Members and Inheritance in JAVASCRIPT module patternHow to implement inheritance in JS Revealing prototype pattern?

http://stackoverflow.com/questions/13418669/javascript-do-i-need-to-put-this-var-for-every-variable-in-an-object

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Javascript:我需要为对象中的每个变量放置this.var吗?