JavaScript继承和超级构造函数

我从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;
    };

})();

我想知道,如果有一个原因,他们使用了.__ super__而不是child.prototype .__ super__(见出评论的代码行).

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

>您可以通过此.__ super __.propertyName而不是ClassName .__ super __.propertyName访问超级属性.所以你在类命名中没有冗余.
>这对于嵌套继承更有意义,因为你可以使用这个.__ 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(这个.__ super__),他们宁愿选择父母的静态参考.实际上,最好不要使用属性,而只是在模块范围内使用本地超级变量.

此外,这个.__ 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

Stack Overflow因为你没有得到你期望的.__ super__!

https://stackoverflow.com/questions/24699276/javascript-inheritance-and-super-constructor

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:JavaScript继承和超级构造函数