首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实用程序函数来实例化扩展已有对象的CoffeeScript类的实例。

实用程序函数来实例化扩展已有对象的CoffeeScript类的实例。
EN

Stack Overflow用户
提问于 2016-03-26 20:03:13
回答 1查看 117关注 0票数 1

因此,我一直在使用CoffeeScript中的原型继承,特别是如何编写继承自特定对象(而不是另一个类)的CoffeeScript类,类似于克罗克福德的对象函数。本质上,我想要做的是编写一个类,它可以从传递给它的构造函数的特定对象继承。不幸的是,我认为如果不求助于setPrototypeOf,这可能是不可能的,考虑到关于它的警告,我宁愿不这么做。相反,我可能会满足于一个可以做类似事情的函数。以下是两种可能性:

代码语言:javascript
运行
复制
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的实例。

代码语言:javascript
运行
复制
console.log test1 instanceof Example # True
console.log test2 instanceof Example # False

考虑到这些函数使用的代码几乎完全相同,我很难弄清楚它们为什么表现出不同的行为。那么,有谁知道为什么test2没有以Example的形式出现,以及我需要修改什么才能做到这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-28 07:27:15

看看CoffeeScript源代码:http://coffeescript.org/v1/annotated-source/nodes.html#section-60

CoffeeScript以不同的方式对待构造函数调用,这取决于它们是用splat (args...)调用还是没有调用。

如果您或者new maker [2]... 调用extendObjectMaker,或者重写您的函数,那么您的代码将给出所需的结果:

代码语言:javascript
运行
复制
extendObjectMaker = (parent, Class) ->
  F = (anon...) -> Class.apply(@, anon)
  F:: = Object.create parent
  F::constructor = Class
  (args...) -> new F args...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36240273

复制
相关文章

相似问题

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