2

这到底是怎么回事?
-class如何Daughter包含已设置的数据,Brother我应该如何确保兄弟类中的数据集不会相互干扰?

class Parent 
  data: {}

class Child extends Parent
  age: 10

Son = new Child
Son.data.name = "John Doe"

Daughter = new Child
console.log Daughter.data # => { name: 'John Doe' }
4

2 回答 2

2

问题似乎是,您没有使用构造函数data为每个实例进行初始化。相反,你给它一个初始值,这个初始值恰好Animal是可变的。每当您分配给 时instance.data.attribute,您实际上是在修改该共享对象。如果您改用了 an data: 1,您将不会看到这种共享行为。

这解决了您的问题:

class Parent 
  constructor: () ->
    @data = {}

免责声明:我对 JavaScript 的原型继承不是很熟悉,所以我提供的技术细节可能不正确,但对现象的描述似乎是准确的。

编译时的区别

class Parent 
  staticD: {}
  constructor: ->
    @data = {}

编译为:

Parent = (function() {

  Parent.prototype.staticD = {};

  function Parent() {
    this.data = {};
  }

  return Parent;

})();

如您所见staticD,在“类”创建时仅data初始化一次,另一方面,在构造函数中初始化并在每次创建实例时分配一个新的空对象。

于 2012-10-15T13:13:16.127 回答
1

如果您将您的 CS 代码放入 CoffeeScript 网站 (http://coffeescript.org/) 的并排编辑器中,您会看到它data位于Parent“类”的原型上。将该原型视为您创建的新功能(类)的模板。该原型要么包含其他函数,要么包含可用于所有实例的变量(如 OO 静态变量)。

您正在添加name一个“静态”变量data。然后它将可供所有“派生”自Parent.

我不确定那里的内部运作,但来自一个面向对象的世界,这就是我解释它的方式。我希望这有帮助。

通过 COFFEESCRIPT 网站生成的代码

var Child, Daughter, Parent, Son,
  __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

Parent = (function() {

  function Parent() {}

  Parent.prototype.data = {};

  return Parent;

})();

Child = (function(_super) {

  __extends(Child, _super);

  function Child() {
    return Child.__super__.constructor.apply(this, arguments);
  }

  Child.prototype.age = 10;

  return Child;

})(Parent);

Son = new Child;

Son.data.name = "John Doe";

Daughter = new Child;

alert(Daughter.data.name);

更新 刚刚注意到 CS 并排窗口具有链接功能。这是并排代码的链接。

更新#2

针对您在评论中提出的问题,我不确定您到底想做什么,但您可以执行以下操作:

class Parent 
  #data: {}

class Child extends Parent
  constructor: (@name) ->
  age: 10
  sayHi: -> alert "Hi " + @name


Son = new Child "John Doe"

Daughter = new Child "Sarah Jane"

Son.sayHi()
Daughter.sayHi()

也许将name变量(或整个data变量)保留在父级别并通过构造函数设置它并通过父函数访问它。

于 2012-10-15T12:56:02.273 回答