Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用下划线创建自己的可继承类_Javascript_Backbone.js_Underscore.js - Fatal编程技术网

Javascript 如何使用下划线创建自己的可继承类

Javascript 如何使用下划线创建自己的可继承类,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,我想构建一个主干。类似对象/类的模型 我查看了主干文档,发现它们通过可继承属性和方法创建了一个可继承的对象/类,分两步进行: I.创建具有某些属性的函数 var Model = Backbone.Model = function(attributes, options) { var defaults; attributes || (attributes = {}); //? if (options && options.parse) attributes

我想构建一个主干。类似对象/类的模型

我查看了主干文档,发现它们通过可继承属性和方法创建了一个可继承的对象/类,分两步进行:

I.创建具有某些属性的函数

var Model = Backbone.Model = function(attributes, options) {
    var defaults;
    attributes || (attributes = {}); //?
    if (options && options.parse) attributes = this.parse(attributes); //?
    if (defaults = getValue(this, 'defaults')) {
      attributes = _.extend({}, defaults, attributes); // ?
    }
    if (options && options.collection) this.collection = options.collection;
    this.attributes = {};
    this._escapedAttributes = {};
    this.cid = _.uniqueId('c');
    this.changed = {};
    this._silent = {};
    this._pending = {};
    this.set(attributes, {silent: true});

    this.changed = {};
    this._silent = {};
    this._pending = {};
    this._previousAttributes = _.clone(this.attributes);
    this.initialize.apply(this, arguments);
};
二,。使用下划线的extend赋予它一些函数

_.extend(Model.prototype, Events, { // Events?
   changed: null,

   _silent: null,

   _pending: null,

   idAttribute: 'id',

   initialize: function(){},

   toJSON: function(options) {
       return _.clone(this.attributes);
   }

   // other Model methods...
};
我对这种行为有一些疑问:

  • 第一部分的第3-4行是做什么的
  • 第6行发生了什么
  • 为什么我们要过多地给Events对象“u.extend”,我还能给什么作为参数呢
  • 还有什么我需要注意的吗


    关于第3行,
    attributes | |(attributes={})是一个示例。
    如果属性具有falsy valye,则javascript将计算OR表达式的第二部分。该部分为
    属性
    分配一个值
    {}
    ,一个空对象。最终结果是,如果属性为null或未定义(典型情况),则为属性分配一个空对象

    这句话相当于说:

    if (attributes == false) { // attributes can be any value that evaluates to false
                               // attributes could be null, undefined, false, 0 etc
       attributes = {};
    }
    
    与第4行相同,
    if(options&&options.parse)attributes=this.parse(attributes)

    如果存在
    options
    对象,即该对象不为null或未定义,并且
    options
    对象具有名为
    parse
    的有效属性,则将
    this.parse(attributes)
    的值分配给属性

    编辑1:

    expndtw-1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1

    创建一个包含所有传入对象属性的新对象是一种标准模式。在第一个示例中,
    attributes=551;.extend({},默认值,attributes);/该模式用于用可能已传递的内容覆盖默认值。您会在大多数允许您传入选项对象的插件中看到这种模式。如果不传入任何内容,将使用默认值。如果只传入几个属性,其余属性将从默认值中获取它们的值

    不完全是一回事。但它非常相似。他们的文档要好得多。你会更好地理解这个概念

    编辑2:

    该类具有一些与事件处理相关的方法。主干模型类还需要能够使用事件处理。它需要引发事件来告诉视图重新呈现自身,当视图更改基础数据时,它需要侦听来自dom的事件。此事件处理功能可以在定义模型类时从头开始重新编写,也可以扩展模型类以从Events类获取这些方法。后者就是正在发生的事情


    如果您阅读了$.extend或uz.extend的文档,您会意识到模型类的扩展不仅包括事件下的属性,还包括其他属性,如toJSON和initialize等

    第3行,
    attributes | |(attributes={})是一个示例。
    如果属性具有falsy valye,则javascript将计算OR表达式的第二部分。该部分为
    属性
    分配一个值
    {}
    ,一个空对象。最终结果是,如果属性为null或未定义(典型情况),则为属性分配一个空对象

    这句话相当于说:

    if (attributes == false) { // attributes can be any value that evaluates to false
                               // attributes could be null, undefined, false, 0 etc
       attributes = {};
    }
    
    与第4行相同,
    if(options&&options.parse)attributes=this.parse(attributes)

    如果存在
    options
    对象,即该对象不为null或未定义,并且
    options
    对象具有名为
    parse
    的有效属性,则将
    this.parse(attributes)
    的值分配给属性

    编辑1:

    expndtw-1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1\cf1

    创建一个包含所有传入对象属性的新对象是一种标准模式。在第一个示例中,
    attributes=551;.extend({},默认值,attributes);/该模式用于用可能已传递的内容覆盖默认值。您会在大多数允许您传入选项对象的插件中看到这种模式。如果不传入任何内容,将使用默认值。如果只传入几个属性,其余属性将从默认值中获取它们的值

    不完全是一回事。但它非常相似。他们的文档要好得多。你会更好地理解这个概念

    编辑2:

    该类具有一些与事件处理相关的方法。主干模型类还需要能够使用事件处理。它需要引发事件来告诉视图重新呈现自身,当视图更改基础数据时,它需要侦听来自dom的事件。此事件处理功能可以在定义模型类时从头开始重新编写,也可以扩展模型类以从Events类获取这些方法。后者就是正在发生的事情


    如果您阅读了$.extend或uz.extend的文档,您会意识到模型类的扩展不仅包括事件下的属性,还包括其他属性,如toJSON和initialize等

    关于第6行的内容-创建的对象包含
    默认值
    对象的所有属性以及
    属性
    对象的所有属性。
    默认值
    对象中已在
    属性
    对象中定义的任何属性都将被后者的值覆盖。

    至于第6行发生了什么-创建的对象包含
    默认值
    对象的所有属性以及
    属性
    对象的所有属性。
    默认值
    对象中已在
    属性
    对象中定义的任何属性都将被后者的值覆盖。

    您好,谢谢您的回答:)第三点怎么了