【问题标题】:Why use this in JavaScript OOP为什么在 JavaScript OOP 中使用它
【发布时间】:2014-12-27 22:36:25
【问题描述】:

我也对 JS 中的this 感到困惑,因为我知道如何在DOM 中使用this,但在OOP 中却无法理解

a = "uff";
function Class1() {
  a = "";
}

function Class2() {
  this.a = "";
}
well = new Class1();
oh   = new Class2();
well.a = "bye";
oh.a = "ok";
console.log(well.a); // output: bye
console.log(oh.a);   // output: ok
console.log(a);      // output: ""

在上面的例子中是否使用this 不会影响代码那么我为什么要使用它以及为什么a 的最后一个值打印为空?我会非常感谢你们所有人。

【问题讨论】:

标签: javascript oop this


【解决方案1】:

正如评论者所提到的,您正在使用所有全局变量,这不是很好的原因有很多(主要是围绕意想不到的后果)。

至于你的问题,你缺少的是这里:

function Class1(){
  a = "";
}

您只需将 a 的全局变量从原来的“uff”重置为“”。

稍后,当你这样做时:

well.a = "bye"

您正在向well 实例添加一个名为a 的新属性,它与您设置的全局变量a 无关。

并非没有,但您所描述的实际上都不是 JavaScript OOP。到目前为止,您使用的只是对象实例及其属性(以及全局变量)。

【讨论】:

    【解决方案2】:

    在 JavaScript 中,this 指的是其方法是正在运行的对象,或者是构造函数当前正在构建的对象。它不一定是用new 构造的对象。

    var o = {
        f: function() { this.a = 2; }
    }
    
    o.a = 1;
    o.f();
    o.a;
    // => 2
    

    "a" 为空,因为 Class1 构造函数清除了它的值。未声明的变量将是全局变量,全局范围内的a 是被修改的变量。

    【讨论】:

    • 其实this指的是你想要它指的任何东西。 someOb.someMethod() 只是(someOb.someMethod || someOb.prototype.someMethod).call(someOb); 之类的语法糖,注意someOb 作为call 的参数。任何对象都可以传入其中,this 将引用该对象,而不是其方法正在运行的对象。即使new 实际上只是语法糖接近function() { var o = {}; someConstructorFunc.apply(o, arguments); return o; } 构造函数并不特殊,它们只是普通的JS 函数。 new 让它们显得特别。
    猜你喜欢
    • 2012-02-22
    • 2016-10-08
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    相关资源
    最近更新 更多