0

如此处定义:

Module.init 的实现如下:

Module.init = Controller.init = Model.init = (a1, a2, a3, a4, a5) ->
  new this(a1, a2, a3, a4, a5)

为什么会这样?为什么定义5个属性而不使用attrs...所以属性不固定为5个......

new this(attrs...)
4

2 回答 2

2

可能是因为编译后的 JS 要小得多(Spine.js 非常强调低占用空间)。

Module.init = Controller.init = Model.init = (a1, a2, a3, a4, a5) ->
  new this(a1, a2, a3, a4, a5)

编译为:

Module.init = Controller.init = Model.init = function(a1, a2, a3, a4, a5) {
  return new this(a1, a2, a3, a4, a5);
};

尽管:

Module.init = Controller.init = Model.init = (args...) ->
  new this args...

编译成更复杂的:

var __slice = [].slice;

Module.init = Controller.init = Model.init = function() {
  var args;
  args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
  return (function(func, args, ctor) {
    ctor.prototype = func.prototype;
    var child = new ctor, result = func.apply(child, args), t = typeof result;
    return t == "object" || t == "function" ? result || child : child;
  })(this, args, function(){});
};

这是因为在 JavaScript 中,new运算符和apply不能一起使用 :(

于 2012-05-17T15:28:39.677 回答
1

要么有人不知道 splats,要么他们觉得这样做更干净,或者他们认为不使用一堆额外的逻辑来处理 arguments 对象会更高效。

于 2012-05-17T15:11:17.530 回答