在JavaScript中,我将不得不使用

Backbone.Model.extend()


为我的模型创建一个“类”。但是在CoffeeScript中,我可以使用

class X extends Backbone.Model


2和2之间有什么区别?我为什么应该使用一个而不是另一个?

一个简单的测试,看看差异http://jsfiddle.net/jiewmeng/t6ZPd/

Test = Backbone.Model.extend()
class Test2 extends Backbone.Model

console.log Test
/*
function (){return i.apply(this,arguments)}
*/

console.log Test2
/*
function Test2() {
    _ref = Test2.__super__.constructor.apply(this, arguments);
    return _ref;
  }
*/


我相信它不会显示所有代码...但是extends()似乎稍微简单一些。奇怪的是,还有其他区别吗?

最佳答案

coffeescript在封闭的顶部创建了extends方法:

__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; };


下划线将其定义为:http://underscorejs.org/docs/underscore.html#section-76

实现略有不同,但效果相同。

如果您使用的是Backbone或更确切地说是Underscore,则可以选择使用任何一种方法,但是coffeescript中的extends允许您扩展任何类,而无需像Underscore或Backbone这样的依赖项。

在使用骨干网时可以使用该方法做什么的一个示例可能是重写构造函数,以为骨干网的options对象中不支持的类提供可选项目。

class MyView extends Backbone.View
  constructor: (foo, bar, options)->
    # locals foo and bar are now assigned
    @foo = foo
    @bar = bar
    super(options) # calls to Backbone.View with the normal options

myView = new MyView("foo","bar", {model: someModel, el: $('#someEl')})
myView.foo # "foo"
myView.model == someModel # true

关于javascript - Backbone.Model.extend()与X类扩展Backbone.Model有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17259999/

10-12 15:40
查看更多