JS中的多态和深度继承

发布于 11-26 15:49 字数 1768 浏览 2 评论 0原文

我正在使用 JS 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 类型...

I'm using the JS prototype inheritance pattern from Gavin Kistner and I'm not quite sure why deep inheritance doesn't work for me.

I want C inherits from B inherits from 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.

When I call foo.init(), I'm actually calling C.init()
Inside C.init() 'this' is of type C
-> this.parent.init.call( this, arg ) is actually calling B.init()
Inside B.init() 'this' is still of type C ( because of .call(this))
-> this.parent.init.call( this, arg ) is, again, calling B.init()

And therefore it goes into an infinite call loop on B.init() ...

What am I doing wrong ?
Should I simply rename 'init' to something else for B and C ? I would rather not, because the current way allows me to call obj.init() whether obj is of type A, B or C...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谢绝鈎搭2024-12-03 15:49:50

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

Change B.parent.init.call( this, arg ); to B.prototype.parent.init.call( this, arg );.

分開簡單2024-12-03 15:49:50

这并没有回答你的问题,但我最近一直在做一些关于 JavaScript 继承的工作。如果你想走古典路线,我真的可以推荐JS.Class;这是一个让课程变得非常简单的库。

如果可以的话,您应该避免使用该库,但如果您不想处理令人头痛的 JavaScript 继承/原型设计,我可以推荐 JS.Class。

This doesn't answer your question, but I have been doing some work with JavaScript inheritance recently. If you want to go the classical route, I can really recommend JS.Class; it's a library that makes classes really easy.

If you can, you should avoid using the library, but if you don't want to deal with the headache of JavaScript inheritance/prototyping, I can recommend JS.Class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文