0

试图了解如何在 Javascript 中完成继承,我偶然发现了许多不同的实现,包括 Crockfords、Resigs、...Prototypeklass

我错过了(我为骚动做好准备)是 Smalltalkish 的自我/超级对:self扮演与 类似的角色this,即代表当前的“对象”,并super引用this.

[跳到“]”如果您知道superSmalltalk 中的功能:假设Subclass已覆盖method1定义 in Superclass,我仍然可以使用super.method1()in访问超类实现Subclass.method2()。这不会执行Subclass.method1()代码。

function Superclass () {
}
Superclass.prototype.method1 = function () {
  return "super";
}

function Subclass () {
}
Subclass.prototype.method1 = function () {
  return "sub";
}
Subclass.prototype.method2 = function () {
  alert (super.method1 ());
}

var o = new Subclass;
o.method2 (); // prints "super"

]

那里有任何“Javatalk”包吗?到目前为止,我只看到了 Javascript 中的 OO 仿真,它可以访问当前定义的方法 ( method2) 的超类实现,而不是任何其他方法 (例如method1)。

谢谢,诺比

4

3 回答 3

1

super你在 JavaScript 中没有特性。

知道超类后,可以直接使用call 调用超方法:

Superclass.method1.call(this);

如果你想模拟一个泛型super(我不提倡),你可以使用这个:

function sup(obj, name) {
     var superclass = Object.getPrototypeOf(Object.getPrototypeOf(obj));
     return superclass[name].apply(obj, [].slice.call(arguments,2));
}

您将用作

sup(this, 'method1');

而不是你的

super.method1();

如果您有要传递的参数:

sup(this, 'method1', 'some', 'args');

代替

super.method1('some', 'args');

请注意,这假设您使用设置的正确原型继承

Subclass.prototype = new Superclass();
于 2013-09-12T14:04:49.893 回答
0

好吧,长话短说:是我读过的最好的 JavaScript 教程。所以我可以向你推荐它。祝你好运!

于 2013-09-12T13:56:10.127 回答
0

有很多方法可以super在 JavaScript 中实现功能。例如:

function SuperClass(someValue) {
    this.someValue = someValue;
}

SuperClass.prototype.method1 = function () {
    return this.someValue;
};

function SubClass(someValue) {
    //call the SuperClass constructor
    this.super.constructor.call(this, someValue);
}

//inherit from SuperClass
SubClass.prototype = Object.create(SuperClass.prototype);

//create the super member that points to the SuperClass prototype
SubClass.prototype.super = SuperClass.prototype;

SubClass.prototype.method2 = function () {
    alert(this.super.method1.call(this));
};

var sub = new SubClass('some value');

sub.method2();

编辑:

这是一个非常通用的super方法的示例,它依赖于非标准功能。我真的不推荐这个,它只是作为学习目的。

Object.prototype.super = function () {
    var superProto = Object.getPrototypeOf(Object.getPrototypeOf(this)),
        fnName = arguments.callee.caller.name,
        constructorName = this.constructor.name;

    if (superProto == null) throw constructorName + " doesn't have a superclass";
    if (typeof superProto[fnName] !== 'function') {
        throw constructorName + "'s superclass (" 
            + superProto.constructor.name + ") doesn't have a " + fnName + ' function';
    }

    return superProto[arguments.callee.caller.name].apply(
        this, 
        [].slice.call(arguments, 1)
    );
};   


function A() {
}

A.prototype.toString = function toString() {
    //call super method Object.prototype.toString
    return this.super();
};

var a = new A();

console.log(a.toString());
于 2013-09-12T14:10:32.217 回答