打零星个角度去讨论Backbone的写类方式

  1. Backbone内部的写类方式,Backbone自身的切近设Model、Collection、View等是哪定义的
  2. Backbone外部的写类方式,如何利用Backbone提供的类来定义自己之好像

 

同样、Backbone内部的写类方式

Backbone提供于客户端程序员的接近都是通过
构造函数+原型
的章程写的,Backbone.Model的代码大致如下

// 定义构造器
var Model = Backbone.Model = function(attributes, options) {
    // ...
    this.set(attrs, options);
    this.changed = {};
    this.initialize.apply(this, arguments);
};

// 扩展原型,往原型上添加了很多方法,如Events
_.extend(Model.prototype, Events, {
    // ...
});

这种写法很传统,Backbone.Collection / Backbone.View / Backbone.Router /
Backbone.History 都是由此这种方法定义之。

 

次、Backbone的外表写类方式

说外表的写类方式,不得不提 extend
方法,该方式定义在Backbone.js的底。不至30行代码,它是私有的,外部并无克顾。
也就是说,这个方法就以Backbone内部使用,为任何模块服务。

 

实质上这个说法不严谨,虽然extend不能够直接看,但它们经过单独一行代码

Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;

转身成为以下方法

  • Backbone.Model.extend
  • Backbone.Collection.extend
  • Backbone.View.extend
  • Backbone.Router.extend
  • Backbone.History.extend

此刻,外部还是得拜取得。

 

当一个闭包内,写一个私房的函数,然后将该函数赋值给多独八九不离十或接近原型。这些写法并无少见,这样描绘节省了内存,函数实例其实仅仅来一样卖。

此外,不要拿这边的extend 和
_.extend
搞混了。_.extend是underscore提供的比底层的章程,用来Mixin对象。这里的extend则是为此来写类。

 

介绍下extend

  1. 它接受两单参数,都是目标类型
  2. 其回到一个接近(构造器,函数),怎么叫都推行
  3. 首先只参数的所有属性、方法还见面拷贝到近似的原型上(实例对象及)
  4. 仲单参数的具备属性、方法都见面拷贝的类上(类静态属性、方法)
  5. 先是个参数中要有constructor属性,那么最终就回其,否则回内部提供的child
  6. 回到的类似产生个非常属性 __super__。

地方的第六沾,使用她杀有利的取父类原型,进而赢得到父类构造器,进而每当子类中失去调用父类,这仿佛于Java里之super关键字。

 

拿示例详细说说

  1. 些微单参数,都是目标类型,第一只扩大为原型方法,第二独扩大为接近方式

    var instanceObj = {

     name: '',
     getName: function() {},
     setName: function(name) {}
    

    }
    var classObj = {

     trim: function(str) {},
     mix: function() {}
    

    }

    // 生成一个新类CustomModel,它具备Backbone.Model的兼具术
    var CustomModel = Backbone.Model.extend(instanceObj, classObj)

    // instanceObj属性都拷贝到了CustomModel.prototype 上
    _.each([‘name’,’getName’, ‘setName’], function(attr) {

     console.log(attr in CustomModel.prototype)
    

    })

    // classObj属性都拷贝到了 CustomModel 上
    _.each([‘trim’,’mix’], function(attr) {

     console.log(attr in CustomModel)
    

    })

 

2.
参数中要生constructor属性,那么最终便赶回其,否则回内部提供的child

就其实告诉使用者可以由自然义构造器,而无采用中的child。

function MyConstructor(name, age) {
    this.name = name;
    this.age  = age;
}
var CustomModel = Backbone.Model.extend({
    constructor: MyConstructor,
    getName: function(){},
    setName: function(){}
})

var m1 = new CustomModel('John', 30)
console.log(m1.constructor === MyConstructor) // true

 

  1. 回去的类闹只与众不同属性
    __super__,用其特别有利的取父类原型,进而赢得到父类构造器,最后以子类中失去调用父类。

    function Person(name, age) {

     this.name = name
     this.age = age
    

    }
    Person.extend = Backbone.Model.extend // 把Backbone的extend拿出来用,O(∩_∩)O~

    function ManConstructor(name, age) {

     ManConstructor.__super__.constructor.call(this, name, age) // 调用父类构造器
     this.gender = 'male'
    

    }
    var Man = Person.extend({

     constructor: ManConstructor
    

    })
    var man = new Man(‘John’, 30)
    console.log(man) // ManConstructor { name=”John”, age=30, gender=”male”}

 

总下Backbone的写类方式

Backbone内部的写类方式是
构造函数+原型。外部写类则是通过extend,写类以及继续又存在。

1.
经过Model(View/Router等)的extend方法写类,产生的切近直接接轨了Model(View/Router等)

  1. 倘若写的接近不是Backbone提供的类似,那么得象3那样,把extend方法以出来

 

利用Backbone开发,多数上还应用方法1,它强制要求将代码分为了几乎叠,一些实用工具函数由underscore提供。

若是浏览器端开发,DOM及HTTP通讯操作一般由jQuery或zepto等提供。你写的代码几乎都汇集在作业处理,无非就是是范(Model)、集合(Collection)、视图(View)、路由于(Router)、历史管理(History)。

 

 

相关:

JavaScript的写类方式

JavaScript的后续方式

 

相关文章

网站地图xml地图