【问题标题】:Coffeescript classes variable fields - keeping initialization cleanCoffeescript 类变量字段 - 保持初始化干净
【发布时间】:2014-06-04 16:50:34
【问题描述】:

我的程序中有一些基本的对象类。它们具有函数和数据字段。我刚刚意识到,如果我在 construct 方法之外声明一些默认数据字段值,那么它们将不会在 object = new Class params 类型的初始化时被重置。

class Book extends DBNode

  language: 'en'
  title: ''
  year: 0

  # function
  bookReaded: (callback)->

    # db stuff
    callback()

ie:在这种情况下,创建一个新的 Book obj 然后编辑其标题将导致以下实例被初始化,标题字段已设置为最后一个实例的值。

class Book extends DBNode

  constructor: ->

    @language: 'en'
    @title: ''
    @year: 0
    super(props, user, cb)

  # function
  bookReaded: (callback)->

    # db stuff
    callback()

而在这种情况下,字段每次都会正确重置,并且标题字段将在每次初始化时设置为空白。

嗯 - 你会说 - 很明显:它们是原型。你会说。我明白了……现在。

不管怎样,这件事对我来说还是有点模糊,所以我想问一下,仅仅在构造函数中声明所有变量字段是否足以提供所需的所有跨实例安全性,或者是否还有其他一些事情应该是在处理原型而不是简单对象时请牢记。

当我在服务器端使用它时,我主要关心的是同时执行可能会弄乱这种全局范围情况的东西,以及我是否应该考虑只使用普通对象(我确实使用了继承在某些功能上具有优势,但没有几行代码无法实现)...

【问题讨论】:

  • “重置”是什么意思?那应该是小写的new吗?您能否发布一些示例代码?
  • 谢谢,我按照建议提供了代码示例

标签: javascript coffeescript


【解决方案1】:

只是在构造函数中声明所有变量字段足以提供所需的所有跨实例安全

这不是关于安全性,而是关于功能。但是,是的,如果您在构造函数中分配所有可变属性,那么您是安全的(对于您示例中的原始值,它实际上并没有什么区别)。

当我在服务器端使用它时,我主要关心的是东西的同时执行

在 JavaScript 中没有同时执行代码。甚至在服务器端也没有。

我是否应该考虑只使用普通对象(我确实在某些函数中利用了继承的优势,但没有什么是通过几行额外的代码无法实现的)...

没有。继承的重点是保存那些代码行。此外,通过将方法放在原型上,您可以提高代码的性能。

【讨论】:

  • 我的意思是线程抱歉。感谢你的回答!最后一个澄清:所以原型会发生什么,新原型将是最后一个原型的克隆,但旧原型将保留其属性,即使全局原型在初始化后可能会发生变化(例如在回调或诸如此类之后)?
  • 没有。每次创建 new Class 对象时,它都会继承自同一个(单个)Class.prototype 对象。而那个通常永远不会改变——只有实例会改变。
猜你喜欢
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 2012-08-01
  • 2016-11-03
  • 2014-05-19
  • 2013-07-12
  • 2012-04-15
  • 1970-01-01
相关资源
最近更新 更多