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;
})();