gpt4 book ai didi

javascript - JS中的多态与深度继承

转载 作者:行者123 更新时间:2023-11-30 06:03:24 25 4
gpt4 key购买 nike

我正在使用 JS prototype inheritance pattern from Gavin Kistner而且我不太清楚为什么深度继承对我不起作用。

我希望 C 继承自 B 继承自 A...

Function.prototype.inheritsFrom = function( parentClassOrObject )
{
if ( parentClassOrObject.constructor == Function )
{
//Normal Inheritance
this.prototype = new parentClassOrObject;
this.prototype.constructor = this;
this.prototype.parent = parentClassOrObject.prototype;
}
else
{
//Pure Virtual Inheritance
this.prototype = parentClassOrObject;
this.prototype.constructor = this;
this.prototype.parent = parentClassOrObject;
}
return this;
}

function A() {
// ...
}
A.prototype.init = function( arg ) {
// ...
}

function B() {
A.apply( this, arguments ); // call super constructor
// ...
}
B.inheritsFrom( A );
B.prototype.init = function( arg ) {
B.parent.init.call( this, arg );
// ...
}

function C() {
B.apply( this, arguments ); // call super constructor
// ...
}
C.inheritsFrom( B );
C.prototype.init = function( arg ) {
this.parent.init.call( this, arg );
// ...
}

var foo = new C();
foo.init( 10 );

// Throws an exception: infinite call loop.

当我调用 foo.init() 时,我实际上是在调用 C.init()
C.init() 中 'this' 是 C 类型
-> this.parent.init.call( this, arg ) 实际上是在调用 B.init()
B.init() 内部 'this' 仍然是 C 类型(因为 .call(this))
-> this.parent.init.call( this, arg ) 再次调用 B.init()

因此它进入了 B.init() 的无限调用循环 ...

我做错了什么?
我应该简单地将 B 和 C 的“init”重命名为其他名称吗?我宁愿不,因为当前的方式允许我调用 obj.init() 无论 obj 是类型 A、B 还是 C...

最佳答案

B.parent.init.call( this, arg ); 更改为 B.prototype.parent.init.call( this, arg );

关于javascript - JS中的多态与深度继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6848398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com