Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.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实现dilemna:寻找具有方法重写解决方案的类_Javascript_Class_Overriding - Fatal编程技术网

Javascript实现dilemna:寻找具有方法重写解决方案的类

Javascript实现dilemna:寻找具有方法重写解决方案的类,javascript,class,overriding,Javascript,Class,Overriding,我不是Javascript专家。我开发了一个操作页面,使用一个函数为我的一些JS代码定义一个类(如上所述)。此类非常复杂,有助于计算对象位置。该系统现已测试并投入使用 我正在写新的页面,我想重新使用这个类。但是,对于每个页面,至少应该覆盖此类的一个方法(如Java中的方法)。我读过另一个问题,所以不可能重写Javascript中的方法 我正在考虑修改类原型,但是如果我这样做,所有的类实例都将被修改 我很不愿意为每一页复制我的类码。这个问题有没有好的/优雅的解决方案?谢谢 解决方案 因此,考虑到西

我不是Javascript专家。我开发了一个操作页面,使用一个函数为我的一些JS代码定义一个类(如上所述)。此类非常复杂,有助于计算对象位置。该系统现已测试并投入使用

我正在写新的页面,我想重新使用这个类。但是,对于每个页面,至少应该覆盖此类的一个方法(如Java中的方法)。我读过另一个问题,所以不可能重写Javascript中的方法

我正在考虑修改类原型,但是如果我这样做,所有的类实例都将被修改

我很不愿意为每一页复制我的类码。这个问题有没有好的/优雅的解决方案?谢谢

解决方案

因此,考虑到西姆·维达斯对亚当·拉基斯方案的评论:

function Base(){}
Base.prototype.foo = function() { alert("base"); };

function Derived() {}

Derived.prototype = Object.create( Base.prototype );
Derived.prototype.foo = function() { alert("overridden"); };


var b = new Base();
var d = new Derived();

b.foo();
d.foo();

请参阅:

您可以在Javascript中重载函数。创建一个新的函数构造函数,该构造函数继承具有要重载的方法的函数,然后更改派生函数原型上的方法

它看起来像这样:

function Base(){}
Base.prototype.foo = function() { alert("base"); };

function Derived() {}

//Derived.prototype = new Base(); //not ideal - see the comments
Derived.prototype = Object.create(Base.prototype); //grab MDN shim for older IE
Derived.prototype.constructor = Derived;

Derived.prototype.foo = function() { alert("overridden"); };

var b = new Base();
var d = new Derived();

b.foo();
d.foo();

Javascript允许定义Base,使用派生的实例化,这与Base无关?哎哟很痛,哈哈!!!您需要
Derived.prototype=Object.create(Base)。你目前的方法有缺陷。(ES5 shim,如果你提到的话)@ŠimeVidas-我知道通常不建议将原型设置为基础的
new
,但对于简单的情况,我认为这是好的,特别是如果它避免了为IE拆分一个垫片。@ŠimeVidas-为了我自己的启发,为什么特别是
Derived.prototype=new base()通常回避?这是因为如果需要构造函数参数,您可能会打破基础吗?还是有更基本的东西?@AdamRackis它有缺陷,因为它在
派生的
实例的原型链中添加了一个额外的无用对象。理想情况下,您希望原型链为:instance->Derived.prototype->Base.prototype->Object.prototype->null。但是,在您的例子中,在链中的这两个
prototype
对象之间有一个
Base
实例对象。这个附加对象不仅没有用处,而且有害,因为它破坏了
getPrototyeOf()
,并且可能包含“默认”属性,这些属性会影响
Base.prototype的属性(这只是我的想法…)。您可以让两个算法都驻留在该方法中,然后根据一个参数,决定应该使用哪种算法…@西梅维达斯知道他在说什么。接受他的建议是个好主意。请注意,旧浏览器不支持对象create,因此如果您想支持旧IE,需要从中获取垫片