gpt4 book ai didi

JavaScript 继承和 super 构造函数

转载 作者:行者123 更新时间:2023-11-28 19:43:16 24 4
gpt4 key购买 nike

我发现并改编了来自 CoffeeScript 的 JavaScript“类”扩展函数:

var extend = (function() {

var hasProp = Object.prototype.hasOwnProperty;

function ctor(child) {
this.constructor = child;
}

return function(child, parent) {
for (var key in parent) {
if (hasProp.call(parent, key)) {
child[key] = parent[key];
}
}
ctor.prototype = parent.prototype;
child.prototype = new ctor(child);
child.__super__ = parent.prototype;
// child.prototype.__super__ = parent.prototype; // better?
return child;
};

})();

我想知道,他们使用 child.__super__ 而不是 child.prototype.__super__ 是否有原因(请参阅注释掉的代码行)。

我更喜欢没有评论的版本,因为:

  1. 您可以通过 this.__super__.propertyName 而不是 ClassName.__super__.propertyName 访问 super 属性。因此,类命名中没有冗余。

  2. 这对于嵌套继承来说更有意义,因为您可以使用 this.__super__.__super__.propertyName 而不是 ClassName.__super__.constructor.__super__.propertyName

我没有看到任何原因,但您甚至仍然可以像这样以“静态”方式调用“静态”函数:

ClassName.prototype.__super__.constructor.staticMethod()

我的版本是否有任何我可能忽略的缺点?

编辑:我将该行更正为 var hasProp = Object.prototype.hasOwnProperty;

最佳答案

因为您根本不应该在代码中使用 __super__

这是一个编译器工件,每次使用super macro/keyword/whatever it is将编译为

ClassName.__super__.methodName.call(this, …) // or
ClassName.__super__.methodName.apply(this, …)
// or, in static class functions even
ClassName.__super___.constructor.functionName.call(this, …)

他们不信任 dynamic this binding当您建议使用 (this.__super__) 时,它们宁愿选择父级的静态引用。实际上,根本不使用属性,而仅在其模块范围内使用本地 super 变量可能是个好主意。

<小时/>

此外,this.__super__ 在继承方法中不起作用:

function A() { }
A.prototype.method = function() { console.log("works") };

function B() { A.call(this); }
B.prototype = Object.create(A.prototype);
B.prototype.__super__ = A.prototype;
B.prototype.method = function() { this.__super__.method.call(this); }


function C() { B.call(this); }
C.prototype = Object.create(B.prototype);
C.prototype.__super__ = B.prototype;

var b = new B(), c = new C();
b.method() // "works"
c.method() // Maximum recursion depth exceeded

堆栈溢出,因为您没有得到您期望的 .__super__!

关于JavaScript 继承和 super 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24699276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com