首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将新类注入到coffeescript继承链中

将新类注入到coffeescript继承链中
EN

Stack Overflow用户
提问于 2011-08-26 22:56:41
回答 1查看 476关注 0票数 4

我有三个coffeescript类,设置如下:

代码语言:javascript
运行
复制
class A
class C extends A
class B

所以原型链看起来像这样:

代码语言:javascript
运行
复制
A -> C
B

我需要原型链看起来像这样:

代码语言:javascript
运行
复制
A -> B -> C

问题是我不能触及A和C的定义。

我想做的是做一个注入函数,它可以像这样调用:

代码语言:javascript
运行
复制
inject B, C

这将B注入到A之前的C的原型链中,然后将B的原型链设置为注入之前的任何C的原型链。

我想这会很简单,就像

代码语言:javascript
运行
复制
C extends (B extends C.prototype)

但不幸的是,事情并不是那么简单,因为coffeescript所做的所有的原型/__超级__魔法。有没有人知道如何注入原型链,这样基本上就像你说的class C extends Bclass B extends A放在首位?

非常感谢。

说明:以下代码不起作用,因为属性复制失败。

代码语言:javascript
运行
复制
class A
  foo: 1
class B
  bar: 2
class C extends A
  baz: 3

B extends A
C extends B

c = new C
console.log c.foo
console.log c.bar
console.log c.baz
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-27 04:15:06

更新:我最初回答说C extends B; B extends A可以工作。这确实会使C instanceof BB instanceof A成为true,但它不会像期望的那样复制原型属性。所以,我重写了答案。

让我们来看看这个:

代码语言:javascript
运行
复制
class A
  foo: 1
class B
  bar: 2
class C extends A
  baz: 3

此时,C::foo为1,C::baz为3。

代码语言:javascript
运行
复制
C extends B

这将用B (child.prototype = ...)的实例覆盖C的现有原型,因此只定义了C::bar

当我们使用class X extends Y语法时,这不会发生,因为只有在X的原型被覆盖之后,属性才会附加到它的原型上。所以,让我们围绕extends编写一个包装器,它保存现有的原型属性,然后恢复它们:

代码语言:javascript
运行
复制
inherits = (child, parent) ->
  proto = child::
  child extends parent
  child::[x] = proto[x] for own x of proto when x not of child::
  child

将此应用于我们的示例:

代码语言:javascript
运行
复制
inherits B, A
inherits C, B

console.log new C instanceof B, new B instanceof A  # true, true
console.log B::foo, B::bar, B::baz  # 1, 2, undefined
console.log C::foo, C::bar, C::baz  # 1, 2, 3

如果您想了解更多关于CoffeeScript类的内部工作原理,您可能想要查看my book on CoffeeScript,它是由PragProg的优秀人员发布的。:)

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

https://stackoverflow.com/questions/7206621

复制
相关文章

相似问题

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