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

时间:2016-01-19 03:56:20

标签: 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, {});

这是如何工作的?在此之前已经定义了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';
}

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

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

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

我的角度是抓住他的意图并在没有下划线依赖的情况下重新创造概念。

1 个答案:

答案 0 :(得分:4)

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

安全我的意思是_.extend(Backbone.Model.prototype, { get: function() { return 'Do Get'; } } // Is an equivalent of Backbone.Model.prototype.get = function() { return 'Do Get'; } 的第一个参数将获得所有对象的所有可枚举属性,在它之后作为参数传递。

Backbone.Model.prototype
  

<强> Backbone.Events

     

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

换句话说,此对象是一组用于自定义事件处理的方法。 以下答案JS - Why use Prototype?

解释了class扩展的原因

谈到ES6,您必须记住,// This will won't work, since you can't extend objects. It has to be a constructor. class Model extends Backbone { ... } 关键字仅为构造函数的旧原型继承引入了语法糖。

<?xml version='1.0' encoding='UTF-8' ?>
    < myCar="4" track="4" level="8"/>
    <params opponents="18,7,3,21,1,2,9" levels="5,7,4,8,6,5,6" startpo="8"/>
    <games>
    <game>
    <counter i="1" crash="3" turn="4"/>
    <counter i="2" crash="0" turn="12"/>
    .
    .
    <counter i="9" crash="3" turn="10"/>
    <counter i="10" crash="0" turn="3"  miniGame="2" win="0" r="5.5" p="99" />
    .
    .
    <counter i="50" crash="18" turn="2"/>
    </game>
    <aftergame>
    <counter="b1" ball="4" wins="0" />
    <counter="b2" ball="5" wins="0" />
    <counter="b3" ball="3" wins="0" />
    <counter="b4" ball="5" wins="0" />
    <counter="b5" ball="5" wins="1" />
    <counter="b6" ball="2" wins="0" />
    </aftergame>
    </games>

我会进一步说一下,并说使用Backbone在ES6课程中效果不佳,请参阅Why Backbone.js and ES6 Classes Don't Mix中的更多内容。