当前位置: 首页 > 面试题库 >

Javascript:是否需要为对象中的每个变量都放置this.var?

黎奇思
2023-03-14
问题内容

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

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

调用getBar()可以正常工作(忽略bar可能未初始化的事实)。其中的变量bargetBar()class的范围内foo,因此this->bar除非我真的需要明确指出我是在指代类bar而不是参数,否则我不需要说。

现在,我正在尝试开始使用Java OOP。因此,我查找了如何定义类并尝试相同的事情:

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

它给了我bar isundefined。更改barthis.bar可解决此问题,但是对每个变量执行此操作会使我的代码混乱很多。每个变量都需要吗?由于我找不到与此相关的任何问题,这使我感到自己在做一些根本错误的事情。

编辑:对了,因此,从注释中我得到的是,this.bar对象的属性,引用的内容与bar局部变量不同。有人可以说出范围和对象方面的确切原因,以及是否有另一种方法来定义不需要此对象的对象吗?


问题答案:

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

构造函数只是一个将属性分配给新创建的对象的函数。可以通过关键字(在函数本地)引用对象(通过使用new关键字的调用创建)。this

方法也只是在对象上调用的函数-
再次this指向该对象。至少当使用成员运算符(点,括号)将该函数作为对象的属性调用时。这给新手带来了很多困惑,因为如果您传递该函数(例如,传递给事件侦听器),则该函数与访问该对象的对象“分离”。

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

例:

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

因此,您可以将两种方法结合起来。请注意,特权方法需要更多的内存,因为您创建具有不同作用域链(但代码相同)的不同功能对象。如果要创建大量实例,则应仅在原型上定义方法。

当您设置从一个“类”到另一个“类”的继承时,它会变得更加复杂-基本上,您必须使子原型对象从父类继承,并将父构造函数应用于子实例以创建“私有属性”
”。



 类似资料:
  • 我正在执行多个ajax调用,我想在显示表单之前完成所有这些调用。如果有错误,我想停止处理,只显示遇到的第一个错误。我谷歌了很多文章,包括StackOverflow上的文章,这些文章展示了如何链接当时的语句。但是似乎我必须给每个语句都附加一个捕获,否则只捕获最后一个语句中的错误。在本例中,Lookup是一个返回promise的异步调用,ShowError处理错误: 假设至少有一个错误,是否有任何方法

  • 问题内容: 如果是这样,为什么会发生此错误?该对象不是或如图所示。 我使用调试我的应用,这张照片摄于。 快速配置: 感谢您的意见,现在我发现是,但新的问题是,如何使再次作品?我想返回如下字符串: 如何重新签署适当的方法? 我尝试了undefined ,不好。看到: 问题答案: JS中的每个对象是否都有toString()方法? 否。只有那些继承自(如所有普通对象一样)或自行定义(或从其自定义原型继

  • 问题内容: 一个简单的问题,我找不到答案。Java是否需要使用try-catch的每个异常?还是仅针对FileNotFoundException? 很多异常(IndexOutOfBoundException,ArithmeticException,IllligalArgumentException,NullPointerException)都说它们不需要异常,但FileNotFoundExcept

  • 目前,我有一个类的集合,其中包含一个纹理、一个VAO和一个VBO。由于所有的状态切换和使用少量三角形调用,绘制数千个这样的对象会导致性能下降。 因此,现在我将更改我的实现,以便创建一系列1MIB VBO(从一个开始,一旦它满了,创建第二个1MIB VBO并继续填充它)。每个VBO需要单独的VAO吗?VBO已经使用了交错的顶点数据,所以我不是在谈论使用多个VBO来处理顶点、法线、纹理库等。

  • 问题内容: 我有一个班级和年龄段。但是,当我更改对象的年龄时,该类的所有其他对象也会更改。 有人可以帮助解决这个问题吗? 问题答案: 静态变量 是 类变量, 因此从变量声明中删除为: 根据java docs: 在声明中具有static修饰符的字段称为静态字段或类变量。它们与类关联,而不与任何对象关联。该类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。

  • 问题内容: 我知道JavaScript中的每个函数都是一类对象,并且它具有内部属性[[scope]],该属性承载该函数的自由变量的绑定记录。但是,有两种特殊情况。 由Function构造函数创建的函数也是闭包吗?由函数构造函数创建的函数对象是特殊的,因为其[[scope]]可能不引用其外部函数的词法环境,而仅引用全局上下文。例如, 这是不直观的。这也称为关闭吗? 如果内部函数没有任何自由变量,我们