为什么骨干在整个过程中使用_.extend()方法?

Mic*_*bry 6 javascript backbone.js

我很好奇创建一个MVC javascript框架,以获得乐趣,并作为一种学习体验.

在backbone.js https://github.com/jashkenas/backbone/blob/master/backbone.js中,作者使用下划线的_.extend()方法来"扩展"骨干对象.

Model我试图找出这个的好处开始.

// Attach all inheritable methods to the Model prototype.
_.extend(Model.prototype, Events, {});
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?Model在此之前已经定义了,那么作者想要Copy all of the properties in the source objects over to the destination object http://underscorejs.org/#extend,他在里面创建了一大堆方法来与源模型作为原型进行交互?

为什么不呢

Backbone.Model.prototype.get = function() {
    return 'Do Get';
}

Backbone.Model.prototype.set = function() {
    return 'Do Set';
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是使用Es6?以下是否与上述相同?

class Model extends Backbone {
  get() {
    return 'Do Get';
  }
  set() {
    return 'Do Set';
  }
}
Run Code Online (Sandbox Code Playgroud)

我是在正确的道路上,还是我在这里错过了一些东西?显然他在es6之前创造了这个东西,但我也很想知道它是否可以完成.

我的角度是抓住他的意图并重新创造这个概念,而没有下划线的依赖性.

hal*_*bra 4

_.extend是安全合并对象的经典方法。

我所说的安全是指第一个参数_.extend(obj1, obj2, ..., objN)将获取所有对象的所有可枚举属性,并在其后作为参数传递。

_.extend(Backbone.Model.prototype, {
  get: function() {
    return 'Do Get';
  }
}

// Is an equivalent of
Backbone.Model.prototype.get = function() {
    return 'Do Get';
}
Run Code Online (Sandbox Code Playgroud)

骨干事件

事件是一个可以混合到任何对象中的模块,使对象能够绑定和触发自定义命名事件。

换句话说,这个对象是一组用于自定义事件处理的方法。扩展的原因在下面的回答JS - Why use Prototype?Backbone.Model.prototype中有解释。

谈到 ES6,您必须记住,该class关键字仅引入了围绕构造函数的旧原型继承的语法糖。

// This will won't work, since you can't extend objects. It has to be a constructor.
class Model extends Backbone {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我会更进一步说 Backbone 不能很好地与 ES6 类一起工作,请参阅为什么 Backbone.js 和 ES6 类不混合中了解更多内容。