在对象方法中使用冗余Javascript吗?

时间:2017-08-07 23:53:58

标签: javascript this

Noob问题,搜索但没有找到这个特定问题的答案。 我正在构建一个对象,并使用'this'关键字引用参数的参数:

function Obj(a, b, c) {
  this.a = a;
  this.b = b;
  this.c = c;
  this.addMe = function() {
    alert(this.a + this.b + this.c);
  };
}

我的问题很简单:如果a,b和c仅存在于对象中(换句话说,没有使用相同名称声明的全局变量),那么在使用它们时需要'this'关键字addMe()方法?该方法不能简单地写成:

this.addMe = function() {
  alert(a + b + c);
};

当我通过创建一个新的Obj实例运行此代码时,它的工作方式完全相同。并且(不是我会这样做)如果我为实例化新Obj时使用的参数创建a,b和c的全局变量值,这些与方法调用的结果无关。那么,如果我不在方法中使用'this',我会错过一些会回来咬我的东西吗?

3 个答案:

答案 0 :(得分:1)

如果您知道this.a(例如)永远不会被重新分配,那么是的,它们实际上应该是相同的。

如果是,那就是。如果你以后忘记了你打算永远不会重新分配它们怎么办?然后你有一个奇怪的错误,可能很难追查。

示例:

function Obj(a) {
  this.a = a;

  this.show = function() {
    console.log(this.a);
    console.log(a)
  };
}

var obj = new Obj(1);
obj.show();

obj.a = 2;
obj.show(); // OOPS!

请注意,对show的第二次调用会给出两个不同的值。 show函数围绕原始值a创建闭包;基本上保存它。

除非你有充分理由不这样做,否则只需使用this.a即可。明确说明你的意图通常是有疑问的方式。节省一些按键很少值得在路上留下潜在的麻烦。

答案 1 :(得分:1)

演示使用a + b + c

的区别/问题



function Obj(a, b, c) {
  this.a = a;
  this.b = b;
  this.c = c;
  this.addMe = function() {
    console.log('addMe', this.a + this.b + this.c);
  };
  this.brokenAddMe = function() {
    console.log('brokenAddMe', a + b + c);
  };
}
var o = new Obj(1,2,3);
o.addMe(); // should be and is 6
o.brokenAddMe(); // should be and is 6
o.a = 4;
o.addMe(); // should be and is 9
o.brokenAddMe(); // should be 9 but still is 6




答案 2 :(得分:0)

按照您定义addMe功能的方式,是的;您只需关闭abc即可使用它们。但问题是,这通常是定义方法的浪费方式,因为 Obj的每个实例都将涉及构建新的addMe函数。

通常,人们倾向于通过依赖ES6类语法或执行Obj.prototype.addMe = ...将可重用方法附加到构造函数之外的原型。在这两种情况下,abc构造函数参数都不在范围内,因此您必须依赖this中可用的属性。