Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中修改原型时的超级函数_Javascript - Fatal编程技术网

在javascript中修改原型时的超级函数

在javascript中修改原型时的超级函数,javascript,Javascript,在javascript中修改原型时是否有类似于super的功能>P>不是默认的,但是如果您正在寻找一种在JavaScript中继承经典继承的方法,您可以考虑使用类似或…或者,如果您不想走这条路,jQuery的创建者John Resig提供了一个非常好的灯光解决方案: 需要注意的是,继承的数组和对象不会通过此实现复制到实例中-因此,如果您继承了一个数组,您将希望在子类构造函数函数中重新定义其值(否则所有实例将共享一个数组)-如果您想看,在那篇文章的评论中也有一条。不是语言本身,但是在创建类时没有

在javascript中修改原型时是否有类似于
super
的功能

>P>不是默认的,但是如果您正在寻找一种在JavaScript中继承经典继承的方法,您可以考虑使用类似或…或者,如果您不想走这条路,jQuery的创建者John Resig提供了一个非常好的灯光解决方案:


需要注意的是,继承的数组和对象不会通过此实现复制到实例中-因此,如果您继承了一个数组,您将希望在子类构造函数函数中重新定义其值(否则所有实例将共享一个数组)-如果您想看,在那篇文章的评论中也有一条。

不是语言本身,但是在创建类时没有理由不能添加它。事实上,关于咖啡脚本的方式有一个很好的解释

此处重现了关键部分:

var __hasProp = Object.prototype.hasOwnProperty;
function __extends(child, parent) {
    for (var key in parent) { 
        if (__hasProp.call(parent, key)) {
            child[key] = parent[key];
        }
    }
    function ctor() { this.constructor = child; }
    ctor.prototype = parent.prototype;
    child.prototype = new ctor;
    child.__super__ = parent.prototype;
    return child;
}

您可能还想阅读。

不幸的是,ECMAScript中没有super关键字或等效关键字。这一直是实现真实继承的混乱和困难的主要来源

很多人已经实现了复杂的解决方案(Prototype library、John Resig和许多其他解决方案),所有这些解决方案都会创建额外的闭包、操作函数代码、使用可能与即将到来的标准更改冲突的特殊名称或其他复杂的技巧。如果存在多个继承级别(A>B>C),这些解决方案中的一些就不起作用,因为它们使用某种形式的“this.super”,总是指C,因此如果B也尝试调用其super方法(在实际代码中发生),就会创建一个无限循环

然而,有一个非常简单的、更有效的解决方案,我在我的项目中成功地找到并使用了它,它适用于任何级别的继承,并且不存在任何名称冲突的风险。无需闭包,无需魔术,只需在所有浏览器上运行的简单明了的JavaScript,如下所示:

// Create base class
Shape = function() {};

// Add method draw() to base class
Shape.prototype.draw = function() {};

// Create new class
Box = function() {};

// Make Box inherit from base class using Douglas Crockford Object.create()
// that is now part of ECMAScript 5 (which is why I recommend it)
Box.prototype = Object.create( Shape.prototype );
// Reset the constructor property erased by the former statement
Box.prototype.constructor = Box;

// Create draw() method for Box that calls it's base class draw() method
Box.prototype.draw = function() {
  Shape.prototype.draw.call( this ); // Here you go!
}
此解决方案的唯一缺点是,与其他解决方案相比,它需要键入更多的按键。但是因为没有涉及闭包,所以没有不必要的函数调用,所以它可能比我迄今为止看到的任何其他解决方案都更有效

或者,如果要将draw()的所有参数传递给super类方法,可以使用以下形式:

Shape.prototype.draw.apply( this, arguments );
或者,如果参数已知且与超级类的参数不同,则可以使用:

Shape.prototype.draw.call( this, param1, param2 );

我希望这对其他人有所帮助:)

可以使用JavaScript的.caller工具创建一个通用解决方案,让您使用与调用函数相同的名称调用函数的超类实现。其基本思想是使用对调用函数的引用,沿着类层次结构查找实际实现该函数的类,然后再上一步获得超级类

有关示例,请参见

这允许调用超级函数,而无需指定当前类的名称。例如,如果A是B的超类,则:

A.prototype.calc = function ( x ) {
    return x * 2;
}
B.prototype.calc = function ( x ) {
    return this._super( x ) + 1;
}

var b = new B();
b.calc( 3 );         // = 7
上述要点中的_super实现在第一次调用时会做更多的工作,但在后续调用中会加快速度。这将使用JavaScript函数.caller(并在旧浏览器中返回到旧参数.callee.caller)。人们普遍认为被调用方/调用方速度慢是因为它们无法优化,但“慢”是一个相对的术语。根据您的用例,这种方法可能就足够了