Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Coffeescript中的类和继承_Javascript_Oop_Coffeescript - Fatal编程技术网

Javascript Coffeescript中的类和继承

Javascript Coffeescript中的类和继承,javascript,oop,coffeescript,Javascript,Oop,Coffeescript,这里到底发生了什么事? 子类-类如何包含在兄弟类中设置的数据,我应该如何确保兄弟类中的数据集不会相互干扰 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' } 如果你把你的CS代码放到

这里到底发生了什么事?
子类
-类如何包含在
兄弟类
中设置的数据,我应该如何确保兄弟类中的数据集不会相互干扰

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' }

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

您正在将
name
添加到“静态”变量
data
。然后,它将可用于所有从
父级
中“派生”的实例

我不确定在那里进行的内部工作,但来自OO世界,这就是我对它的解释。我希望这有帮助

通过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()

可能将
名称
变量(或整个
数据
变量)保留在父级,并通过构造函数进行设置,然后通过父函数进行访问。

问题似乎是,您没有使用构造函数为每个实例初始化
数据。取而代之的是,你给它一个初始值,它恰好位于
Animal
上,这个值是可变的。无论何时分配给
instance.data.attribute
,实际上都在修改该共享对象。如果您使用的是
data:1
,您就不会看到这种共享行为

这可以解决您的问题:

class Parent 
  constructor: () ->
    @data = {}
免责声明:我不太熟悉JavaScript的原型继承,因此我提供的技术细节可能不正确,但对这种现象的描述似乎是准确的

编译时的差异 汇编至:

Parent = (function() {

  Parent.prototype.staticD = {};

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

  return Parent;

})();

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

最好不要使用“static variable”之类的术语为了避免混淆原型与经典之间的区别。谢谢@mattwipple。我稍微调整了一下我的文字。我试图从面向对象的角度来回答这个问题,因为我假设OP是从这个角度来看代码的。也许这是我的一个很大的假设是的,画比较是一种方法,只要它们有区别。OP的一个问题似乎是,他已经从这个角度看了太多代码,所以应该提醒他“这不是你可能认为的那样”,谢谢你的解释,但是我该如何解决这个问题呢?我尝试在
Parent
中创建构造函数,重置
data
属性,但仍然没有效果。有什么想法吗?我添加了一个更新作为一个可能的解决方法(一个非常简单的例子),但它可能会为您指明正确的方向。我希望有帮助!很抱歉也试过了,没什么区别unfortunately@Industrial这很奇怪,因为当我在CoffeeScript.org上尝试这一点时,它起作用了。请再试一次。谢谢。这解决了我的问题!除了下面的答案之外,值得注意的是,儿子和女儿不是班级,就像你在问题中提到的那样。它们实际上是
的实例,扩展了
原型。
Parent = (function() {

  Parent.prototype.staticD = {};

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

  return Parent;

})();