如何避免在JavaScript中使用`this`指针?

时间:2017-05-22 05:00:29

标签: javascript this

我正在阅读prototipcal inheritance。在那里,从其他地方,我正在学习这种避免经典遗产的方式,我仍在消化。

然而,令我困惑的一个方面是this指针,据说这对于像我这样来自经典OO语言的许多人来说会引起混淆。 (如果我要避免经典继承,我也不应该避免this吗? )

经过一些阅读后,我意识到 this指针不是在对象/函数定义时定义的(如在C ++中),而是在函数调用的位置定义。 this指针似乎(对我而言)就像一个悬垂指针,其目标取决于你在何处/如何使用它。

使用关于扩展对象的链接博客文章中的示例,有人可以帮助解释以下内容:

我们可以避免使用this或将其替换为显式对象引用吗?

一个相关的问题是,如果我只使用原型继承,那么this指针是否必要?

博客示例:

  

将这两个操作合并为一个很好,...和   用新属性扩展它。这个名为extend的操作可以   作为一个功能实现:

 1 Object.prototype.extend = function (extension) {
 2     var hasOwnProperty = Object.hasOwnProperty;
 3     var object = Object.create(this);
 4 
 5     for (var property in extension)
 6         if (hasOwnProperty.call(extension, property) ||
 7             typeof object[property] === "undefined")
 8                 object[property] = extension[property];
 9 
10     return object;
11 };
  

使用上面的扩展函数,我们可以将square的代码重写为   如下:

1 var square = rectangle.extend({
2     create: function (side) {
3         return rectangle.create.call(this, side, side);
4     }
5 });
6 
7 var sq = square.create(5);
8 
9 alert(sq.area());

注意,this用于两个代码段的第3行。

1 个答案:

答案 0 :(得分:0)

如果你想完全避免this,那么你应该放弃创建对它们所应用的对象起作用的方法,这意味着你不应该有obj.method()之类的方法调用,其中{ {1}}需要以某种方式使用method的状态。

因此,以下效果应与obj

相同
obj.method()

在上面会失败的地方,你需要重构代码,这样你原则上可以这样使用它而不会出现问题:

var method = obj.method;
method();

因此,一般来说,您需要创建另外一个参数的实用程序函数:要应用逻辑的对象。

在你的情况下,这意味着你没有在var method = obj1.method; method(obj2); // apply method on obj2 上定义extend(无论如何都是considered bad practice),而是在Object.prototype本身上定义,并给它额外的源对象参数。这也是定义了多少本机方法,如Object.assignObject.keys等。此外,Object的定义需要进行一些更改才能使其无需使用rectangle即可运行:

this

正如您所知,有许多方法可以使用JavaScript并在JavaScript中实现某种形式的继承,每种方法都有其优点和缺点。