我正在阅读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行。
答案 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.assign
,Object.keys
等。此外,Object
的定义需要进行一些更改才能使其无需使用rectangle
即可运行:
this
正如您所知,有许多方法可以使用JavaScript并在JavaScript中实现某种形式的继承,每种方法都有其优点和缺点。