去年买的《基于MVC的javascript Web富应用开发》,拖到现在还没看完,作者介绍了三个MVC框架,Spine ,backbone和javascriptMVC。1和2在国内的流行度,不高,我就只打算学backbone了。

backbone依赖于underscore.js,所以在引入的时候需要先引underscore -_-#
=>  Uncaught TypeError: Cannot call method 'each' of undefined

Backbone的模块

1)Events 事件驱动方法
2)Model 数据模型
3)Collection 模型集合器
4)Router 路由(hash)
5) History 开启历史管理
6) Sync 同步服务器方式
7) View 视图(事件行为与渲染页面)

Events模块可以混合到任何模块中。使对象可以绑定和触发自定义事件。

_.extend(Model.prototype, Events, {});
_.extend(Collection.prototype, Events, {});
_.extend(View.prototype, Events, {});
_.extend(Router.prototype, Events, {});

Model与Collection的关系:Collection是Model的集合,对单独的模型集合在一起然后进行整体操作。

backbone的控制器并没有单独分离出来,它与渲染视图一起混杂在View中。

Backbone对象

console.log(Backbone);

/*{
$: function ( selector, context ) {},
Collection: function (models, options) {},
Events: Object,
History: function () {},
Model: function (attributes, options) {},
Router: function (options) {},
VERSION: "1.1.2",
View: function (options) {},
ajax: function () {},
bind: function (name, callback, context) {},
emulateHTTP: false,
emulateJSON: false,
history: Backbone.History,
listenTo: function (obj, name, callback) {},
listenToOnce: function (obj, name, callback) {},
noConflict: function () {},
off: function (name, callback, context) {},
on: function (name, callback, context) {},
once: function (name, callback, context) {},
stopListening: function (obj, name, callback) {},
sync: function (method, model, options) {},
trigger: function (name) {},
unbind: function (name, callback, context) {},
__proto__: Object
}*/

Model

看一下Backbone的Model构造器

  var Model = Backbone.Model = function(attributes, options) {
var attrs = attributes || {};
options || (options = {});
this.cid = _.uniqueId('c');
this.attributes = {};
if (options.collection) this.collection = options.collection;
if (options.parse) attrs = this.parse(attrs, options) || {};
attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
this.set(attrs, options);
this.changed = {};
this.initialize.apply(this, arguments);
};

options用第2种写法的原因是其性能更好,如果options存在,就可避免一次赋值的操作

options=options||{};//
options|(options={});//

cid属性不知道是干嘛的,为什么要把attributes属性留出来?以及中间那一大堆都在干嘛,最后是调用了initialize方法做初始化工作?

创建一个Model:(好吧,写错了,User和User1都应该用小写开头- -)

var User=new Backbone.Model();

var User1=new Backbone.Model({'name':'susan'});

Model.extend()方法

keys(Backbone.Model)
//["extend"]
Model有一个静态方法extend:没看过underscore,源码以后再看 ~~~~(>_<)~~~~ 
总之,第一个参数对象的属性都被传到了extend生产的构造器的原型上,第二个参数对象的属性都成了extend生成的构造器的静态属性
  var extend = function(protoProps, staticProps) {
var parent = this;
var child; // The constructor function for the new subclass is either defined by you
// (the "constructor" property in your `extend` definition), or defaulted
// by us to simply call the parent's constructor.
if (protoProps && _.has(protoProps, 'constructor')) {
child = protoProps.constructor;
} else {
child = function(){ return parent.apply(this, arguments); };
} // Add static properties to the constructor function, if supplied.
_.extend(child, parent, staticProps); // Set the prototype chain to inherit from `parent`, without calling
// `parent`'s constructor function.
var Surrogate = function(){ this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate; // Add prototype properties (instance properties) to the subclass,
// if supplied.
if (protoProps) _.extend(child.prototype, protoProps); // Set a convenience property in case the parent's prototype is needed
// later.
child.__super__ = parent.prototype; return child;
};
var User1=Backbone.Model.extend({});
var User2=Backbone.Model.extend({'initalize':function(){console.log('init ing')}});
var user1=new User1();
var user2=new User2();

cid似乎是实例的标志。对比user1和user2,可知,Backbone.Model.extend构造器传入的第一个参数(对象)属性添加到了原型链上。

Backbone.Model.extend生成的User2构造器,比如这里,在实例化User2的时候传入{'name':'susan'},这些键值对最后被保存在了实例的attributes属性中。

var User4=Backbone.Model.extend({'initalize':function(){console.log('init ing')}},{'checkFn':function(){console.log("check fn ing")}});
keys(User4);
//["extend", "checkFn", "__super__"]

这里可以看到,checkFn确实是作为了User4的静态属性。

set 和 get方法

var User1=Backbone.Model.extend({});
var user1=new User1({'name':'susan'});
user1.get('name');
//"susan"

从这里可以看到 new User1()的时候传入一个对象参数,等同于user1.set()方法 ?

set的两种用法 : set(name,value) 与 set({name:value})

user1.set('name','lily');
user1.get('name');
//lily
user1.set({'name':'lucy','age':'25'});
user1.get('name');//lucy
user1.get('age');//

Backbone学习记录(1)的更多相关文章

  1. Backbone学习记录(7)

    事件委托 <form> <input type="text" class="txt"> <input type="but ...

  2. Backbone学习记录(6)

    路由 backbone将路由规则和一个方法名绑定到一起,来控制单页的hash,以及单页的前进后退. var UserRouter = Backbone.Router.extend({ routes: ...

  3. Backbone学习记录(5)

    数据与服务器 var User=Backbone.Model.extend({ defaults:{ name:'susan', age:18 }, url:'/user'//数据提交的路径 }); ...

  4. Backbone学习记录(4)

    事件绑定  on()方法 调用格式:object.on(event, callback, [context])"change" — 当attributes变化时"chan ...

  5. Backbone学习记录(3)

    创建视图 同前面创建模型和集合的方式一样,Backbone.View.extend()即可创建视图 var UserView=Backbone.View.extend(); var view1=new ...

  6. Backbone学习记录(2)

    创建一个集合 1)new Backbone.Collection()方式 var user=new Backbone.Model({'name':'susan'}); var list=new Bac ...

  7. Backbone 学习笔记

    Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用. 借助Backbone 我们可以使用REST的方式来最小化客户 ...

  8. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  9. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

随机推荐

  1. #1241 : Best Route in a Grid

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个N行N列的非负整数方阵,从左上角(1,1)出发,只能向下或向右走,且不能到达值为0的方格,求出一条到达右下角的最佳 ...

  2. XMLHttp.send()不传参时必须传null吗?

    xmlhttp的send是传递参数用的,但是只有在使用post方式提交请求的时候才有用如下:xmlhttp.open("post",url,true); ...xmlhttp.se ...

  3. 一步一步学Silverlight 2系列(12):数据与通信之WebClient

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  4. C/C++ 编译器优化

    0. gcc -o gcc -o 的优化仍然是机械的,想当然的.只有做到深入理解计算机系统,加深对编程语言的理解,才能写出最优化的代码. Linux下gcc 优化等级的介绍 gcc -o0 ⇒ 不提供 ...

  5. 【NOI 2015】软件包管理器

    [题目链接] 点击打开链接 [算法] 树链剖分,子树的DFS序也是连续的一段 要注意细节! [代码] #include<bits/stdc++.h> using namespace std ...

  6. 【SDOI2012】 Longgue的问题

    [题目链接] 点击打开链接 [算法] gcd(i,n)是n的约数 不妨设gcd(i,n) = d 考虑枚举d和gcd(i,n) = d有多少个 gcd(i,n) = d gcd(i/d,n/d) = ...

  7. JAVA Synchronized (一)

    <编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下Java线程同步中的一 ...

  8. 【旧文章搬运】Windows句柄表分配算法分析(三)

    原文发表于百度空间,2009-03-30========================================================================== 三.当需要 ...

  9. CodeForces 718C && HDU 3572 && Constellation

    Point 1. 区间乘以一个数/矩阵的幂时,不要用指数相加的方法. 而要用直接维护mulv[x]表示区间要乘多少. 不然的话,空加一个logn 2. 要点在于,冲突的点连边,形成二分图,对于在同一个 ...

  10. Android.mk中call all-subdir-makefiles和call all-makefiles-under,$(LOCAL_PATH)的区别(转载)

    转自:http://blog.csdn.net/jackyu613/article/details/5949324 在写Android.mk文件时,call all-subdir-makefiles和 ...