因此,我一直在使用CoffeeScript中的原型继承,特别是如何编写继承自特定对象(而不是另一个类)的CoffeeScript类,类似于克罗克福德的对象函数。本质上,我想要做的是编写一个类,它可以从传递给它的构造函数的特定对象继承。不幸的是,我认为如果不求助于setPrototypeOf,这可能是不可能的,考虑到关于它的警告,我宁愿不这么做。相反,我可能会满足于一个可以做类似事情的函数。以下是两种可能性:
a = {foo: 1}
class Example
constructor: (@bar) ->
extendObject = (parent, Class, args...) ->
F = (anon...) -> Class.apply(@, anon)
F:: = Object.create parent
F::constructor = Class
new F args...
extendObjectMaker = (parent, Class) ->
F = (anon...) -> Class.apply(@, anon)
F:: = Object.create parent
F::constructor = Class
F
maker = extendObjectMaker a, Example
test1 = extendObject a, Example, 2
test2 = new maker 2现在,我非常喜欢第二种方法,因为它返回的本质上是一个新类,然后您可以使用常规的构造函数语法。只有一个问题:虽然使用extendObject创建的对象正确地标识为Example,但是使用extendObjectMaker作为F返回的构造函数创建的对象并不是Example的实例。
console.log test1 instanceof Example # True
console.log test2 instanceof Example # False考虑到这些函数使用的代码几乎完全相同,我很难弄清楚它们为什么表现出不同的行为。那么,有谁知道为什么test2没有以Example的形式出现,以及我需要修改什么才能做到这一点呢?
发布于 2016-03-28 07:27:15
看看CoffeeScript源代码:http://coffeescript.org/v1/annotated-source/nodes.html#section-60。
CoffeeScript以不同的方式对待构造函数调用,这取决于它们是用splat (args...)调用还是没有调用。
如果您或者用new maker [2]... 调用extendObjectMaker,或者重写您的函数,那么您的代码将给出所需的结果:
extendObjectMaker = (parent, Class) ->
F = (anon...) -> Class.apply(@, anon)
F:: = Object.create parent
F::constructor = Class
(args...) -> new F args...https://stackoverflow.com/questions/36240273
复制相似问题