首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拥有对‘超类’中*所有*方法的访问的Javascript继承?

拥有对‘超类’中*所有*方法的访问的Javascript继承?
EN

Stack Overflow用户
提问于 2013-09-12 13:52:16
回答 3查看 219关注 0票数 0

为了理解如何在Javascript中实现继承,我偶然发现了许多不同的实现,包括Crockfords、Resigs、Prototypeklass和其他实现。

我错过的(我准备好面对喧嚣)是Smalltalkish self/Super结对:self扮演着与this相似的角色,即表示当前的"object",super指的是只使用超类的this版本。

如果您知道super在Smalltalk中做了什么:假设Subclass已经覆盖了在Superclass中定义的method1,那么我仍然可以使用Subclass.method2()中的super.method1()访问超类实现。这将不会执行Subclass.method1()代码。

代码语言:javascript
运行
复制
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)。

谢谢你,诺比

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-12 14:10:32

super中实现JavaScript特性的方法太多了。例如:

代码语言: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方法的例子,它依赖于非标准特性。我真的不推荐这个,它只是为了学习的目的。

代码语言:javascript
运行
复制
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());
票数 0
EN

Stack Overflow用户

发布于 2013-09-12 14:04:49

super中没有JavaScript特性。

当您知道超类时,可以直接使用打电话调用超级方法:

代码语言:javascript
运行
复制
Superclass.method1.call(this);

如果您想模仿一个通用的super (我不提倡),可以使用以下方法:

代码语言:javascript
运行
复制
function sup(obj, name) {
     var superclass = Object.getPrototypeOf(Object.getPrototypeOf(obj));
     return superclass[name].apply(obj, [].slice.call(arguments,2));
}

你会用它作为

代码语言:javascript
运行
复制
sup(this, 'method1');

而不是你的

代码语言:javascript
运行
复制
super.method1();

如果你有争论要通过:

代码语言:javascript
运行
复制
sup(this, 'method1', 'some', 'args');

而不是

代码语言:javascript
运行
复制
super.method1('some', 'args');

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

代码语言:javascript
运行
复制
Subclass.prototype = new Superclass();
票数 1
EN

Stack Overflow用户

发布于 2013-09-12 13:56:10

好吧,长话短说:是我读过的最好的JavaScript教程。所以我可以重新评论给你听。祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18766212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档