繁体   English   中英

在对象方法中冗余Javascript这个?

[英]Redundant Javascript this in object method?

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仅存在于对象中(换句话说,没有使用相同名称声明的全局变量),则在addMe中使用它们时需要'this'关键字( ) 方法? 该方法不能简单地写成:

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

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

如果你知道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被重新分配时,它保持不变。

除非你有充分的理由不这样做,否则只需使用this 明确说明你的意图通常是有疑问的方式。 为自己节省几次击键很少值得在路上头痛。

为了证明使用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 oa = 4; o.addMe(); // should be and is 9 o.brokenAddMe(); // should be 9 but still is 6 

通过你定义addMe功能的方式,是的; 你可以简单地关闭abc并使用它们。 然而问题是这通常是定义方法的浪费方式,因为Obj 每个实例化都将涉及构建新的addMe函数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM