去年买的《基于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. 【bzoj3620】似乎在梦中见过的样子

    枚举左端点,对于每个右端点处理出以右端点为结尾最大长度使得从左端点开始的前缀等于以右端点结束的后缀,即next数组 然后一直往前跳,直到长度小于子串长度的一半为止. #include<algor ...

  2. 锁粒度 Deadlocks

    锁粒度 MySQL :: MySQL 5.7 Reference Manual :: 14.5.2.4 Locking Reads https://dev.mysql.com/doc/refman/5 ...

  3. 探索C++的底层机制

    探索C++的底层机制 在看这篇文章之前,请你先要明白一点:那就是c++为我们所提供的各种存取控制仅仅是在编译阶段给我们的限制,也就是说是编译器确保了你在完成任务之前的正确行为,如果你的行为不正确,那么 ...

  4. 怎样在QML中利用Sprite来做我们须要的动画

    在游戏中动画的设计很中要. 在QML中,它提供了丰富的animation.可是有时我们须要对图像进行变化,就像放电影一样.在今天的这篇文章中,我们将设计一个能够变化图像的动画. 我们能够通过Qt所提供 ...

  5. extjs4.0 treepanel节点的选中、展开! 数据的重新加载

    1.extjs4.0API较3.0有非常大变化2.多级子父节点的选中和展开.3.数据的重新加载.tree.getStore().load4.节点的移除,从树中根据ID获取节点 tree.getStor ...

  6. leetcode 677. Map Sum Pairs

    Implement a MapSum class with insert, and sum methods. For the method insert, you'll be given a pair ...

  7. java多线程实现简单队列

    1.创建Queue.java public class Queue { private LinkedList<Object> list = new LinkedList<Object ...

  8. JQuery操作TABLE,及console.info问题。

    还用alert 吗?看看console.info吧,代码的测试平台:ie9, firefox12 ​1. [代码][JavaScript]代码<!DOCTYPE html><html ...

  9. phpMVC框架的核心启动类定义

    <?php//核心启动类class Framework { //定义一个run方法 public static function run(){ // echo "hello,wrold ...

  10. SPOJ:Elegant Permuted Sum(贪心)

    Special Thanks: Jane Alam Jan*At moment in University of Texas at San Antonio - USA You will be give ...