CoffeScript中有以下类:
class MyClass
f: (@x) ->
在JS中翻译此代码我们有:
(function() {
var MyClass;
MyClass = (function() {
function MyClass() {}
MyClass.prototype.f = function(x) {
this.x = x;
};
return MyClass;
})();
}).call(this);
我不明白为什么为了向MyClass添加功能我应该使用原型;为什么我不能使用'MyClass.f = function(x)......'?请解释一下。谢谢。
答案 0 :(得分:2)
如果你定义
class MyClass
f: (@x) ->
@g: (@x) ->
m = new MyClass()
你会发现,MyClass
有一个g
属性,但不是f
,而m
有一个f
,但没有{{1} }}
要从g
访问g
,您必须使用m
。
另外m.constructor.g
。
要真正理解这一点,你需要深入研究Javascript的原型继承结构。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
当执行代码new foo(...)时,会发生以下情况:
创建一个新对象,继承自foo.prototype。
使用指定的参数调用构造函数foo ...
构造函数返回的对象成为整个新表达式的结果。 ...
所以关键点是新对象从类MyClass.prototype == m.__proto__
继承(实际上是副本)。
答案 1 :(得分:0)
您不必使用原型链,您可以像这样分配静态方法:
class MyClass
@f: (@x) ->
将输出:
var MyClass;
MyClass = (function() {
function MyClass() {}
MyClass.f = function(x) {
this.x = x;
};
return MyClass;
})();