Backbone之extend方法

来源:互联网 发布:向境外提供网络数据 编辑:程序博客网 时间:2024/06/05 09:15

前言
        最终还是决定写一下关于backbone的源码分析,主要是因为网上关于backbone的中文资料太少了,官网提供的API也不是很全,希望我写的博文可以提供一份比较全的文档,为项目的开发和自主学习带来些许便利,博文中有任何错误问题欢迎大家指出。
正文
     backbone是一个轻量级的mvc框架,主要由事件类:Backbone.Event,模型类:Backbone.Model,集合类:Backbone.Collection,视图类:Backbone.View,路由类:Backbone.Router,历史类:Backbone.History组成。
关于这些类,在随后的博文中会一一介绍,今天主要介绍Backbone提供的extend方法,除了Event类,其他类都含有extend方法,该方法在开发时是最常用的,就是为了生成子类的,我们就来看看该方法都干了哪些好事,体会一下生孩子的过程吧。
extend方法接受两个参数:
参数1:protoProps,为子类的原型prototype提供属性
参数2:staticProps,为子类自身提供属性
extend方法的设计图
extend
生成的子类就是图片中间的构造函数对象,从图中我们可以看到,

  • 它的来源有两处:

    1.参数1中的protoProps的constructor属性,如果你将来想要指定子类的构造函数,可以为constructor属性赋函数引用,例如:

var func=function(){    alert('我是构造函数');}var Model = Backbone.Model.extend({constructor:func});var model = new Model();// 执行该语句会弹出对话框

       2.如果参数1不含有constructor属性,那么extend方法内部会生成一个构造函数,并且该函数会调用父类的构造函数。

               extend方法内部生成构造函数的源码,其中parent就是父类构造函数的引用:

function(){ return parent.apply(this, arguments); }

这个地方,我觉得Backbone存在一个问题(不能称之为bug),在此提一下,大家注意一下即可。在第1条中提到了constructor属性,如果我指定了constructor属性但是我未给它赋一个函数引用,例如{constructor:”“},这时执行new Model(),会发生异常。按说这种情况下,应该走第2条,随后自动将constructor属性值覆盖成新生成的构造函数,以提高代码的容错率。有一句话可能可以解释这现象,我们无法揣测作者的意图就好比作者无法揣测我们的意图一样。

  • 它由3方面构成:
    1.自身属性:
           该属性是子类自身的属性,不是子类原型中的属性。自身属性由父类的属性(父类的自身属性和父类的原型属性) 和参数2的staticProps属性构成。如果父类的自身属性与staticProps属性存在相同的情况,那么staticProps属性值会覆盖父类的自身属性值。
    2.子类的原型:
           该原型由三部分组成:

     - constructor属性,该属性指向上文提到的构造函数的引用,其实就是子类本身。 - 父类的原型,形成一条原型链。 - 参数1的protoProps,如果protoProps属性与子类原型的属性一样,则会覆盖子类原型的属性值。

    3.__super__:
           该属性只是为了方便我们获取父类的原型,它的值就是父类的原型。

总结
       当我们调用extend方法的时候,会给它传递两个参数protoProps和staticProps,这两个参数是object类型,分别拥有自己的属性,这些属性是我们自定义的属性,但如果我们要自定义子类的构造函数,就必须为参数protoProps添加一个constructor属性,该属性指向我们自定义构造函数的引用(注意,在我们自定义的构造函数内部,添加完自己的逻辑,最后还是需要调用一下父类的构造函数。)。如果protoProps不含有constructor属性,extend方法内部会自动生成一个构造函数。随后为该构造函数对象添加属性:
【参数staticProps】,【父类的属性】以及【__super__】构成了构造函数对象的自身属性;
【constructor属性】,【父类的原型】以及【参数protoProps】构成了构造函数对象的原型属性;
最后extend方法返回该构造函数的引用。

0 0
原创粉丝点击