【问题标题】:Why does backbone use the _.extend() method throughout?为什么骨干网始终使用 _.extend() 方法?
【发布时间】:2025-12-11 02:10:01
【问题描述】:

我对创建一个 MVC javascript 框架感到好奇,并作为一种学习体验。

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

Model 开始,我试图找出这样做的好处。

// Attach all inheritable methods to the Model prototype.
_.extend(Model.prototype, Events, {});

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

为什么不这样做

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

Backbone.Model.prototype.set = function() {
    return 'Do Set';
}

还是使用 Es6 更好?下面的和上面的一样吗??

class Model extends Backbone {
  get() {
    return 'Do Get';
  }
  set() {
    return 'Do Set';
  }
}

我是在正确的道路上,还是我在这里遗漏了什么?显然他在 es6 出现之前就创建了这个,但我也很想知道它是否可以做到。

我的角度是把握他的意图并重新创建概念,而不需要下划线依赖。

【问题讨论】:

  • 您可以通过扩展每个集合从多个集合中“继承”,而将其绑定到原型会创建一个关联。它还可以让您更轻松地编辑实例而不影响其他代码,因为这些方法是自己的属性而不是实际的原型方法。
  • 查看link
  • 这里的Events对象是一个mixin...阅读mixins...

标签: javascript backbone.js


【解决方案1】:

_.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';
}

Backbone.Events

Events 是一个可以混入任何对象的模块, object 绑定和触发自定义命名事件的能力。

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

说到 ES6,你必须记住,class 关键字只是围绕构造函数的旧原型继承引入了语法糖。

// This will won't work, since you can't extend objects. It has to be a constructor.
class Model extends Backbone {
  ...
}

我会更进一步说,Backbone 不能很好地与 ES6 类一起工作,请参阅Why Backbone.js and ES6 Classes Don't Mix 了解更多信息。

【讨论】:

    最近更新 更多