Backbone学习记录(1)
去年买的《基于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)的更多相关文章
- Backbone学习记录(7)
事件委托 <form> <input type="text" class="txt"> <input type="but ...
- Backbone学习记录(6)
路由 backbone将路由规则和一个方法名绑定到一起,来控制单页的hash,以及单页的前进后退. var UserRouter = Backbone.Router.extend({ routes: ...
- Backbone学习记录(5)
数据与服务器 var User=Backbone.Model.extend({ defaults:{ name:'susan', age:18 }, url:'/user'//数据提交的路径 }); ...
- Backbone学习记录(4)
事件绑定 on()方法 调用格式:object.on(event, callback, [context])"change" — 当attributes变化时"chan ...
- Backbone学习记录(3)
创建视图 同前面创建模型和集合的方式一样,Backbone.View.extend()即可创建视图 var UserView=Backbone.View.extend(); var view1=new ...
- Backbone学习记录(2)
创建一个集合 1)new Backbone.Collection()方式 var user=new Backbone.Model({'name':'susan'}); var list=new Bac ...
- Backbone 学习笔记
Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用. 借助Backbone 我们可以使用REST的方式来最小化客户 ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
随机推荐
- java zip压缩优化版 解决压缩后文件一直被占用无法删除
最近进行zip操作,从网上找到一个处理方法,但是经过试验存在一些bug,主要是文件流的申明存在问题,导致jvm一直占用文件而不释放,特意把自己修改的发出来,已备记录 import java.io.Bu ...
- Spring Boot2.0之整合Redis
需要的maven依赖 jar包,是对Jedis的封装 maven依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" ...
- YTU 2577: 小数计算——结构体
2577: 小数计算--结构体 时间限制: 1 Sec 内存限制: 128 MB 提交: 978 解决: 647 题目描述 小数可以看成是一个点和两个数组成的,因此可以定义成一个小数的结构体,现在 ...
- CodeForces-607B:Zuma (基础区间DP)
Genos recently installed the game Zuma on his phone. In Zuma there exists a line of n gemstones, the ...
- BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治
BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治 Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM) ...
- Android应用开发完全退出程序的通用方法
在开发一个android应用时,有可能有N个Activity,而在每个Activity里的菜单里有个"退出程序"菜单,这里就要完全退出程序了,所以今天给大家分享的是Android应 ...
- JAVA编程思想中总结的与C++的区别
Java和C++都是面向对象语言.也就是说,它们都能够实现面向对象思想(封装,继乘,多态).而由于c++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象 ...
- CreateThread创建线程 互斥量锁
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD:线程安全相关的属性,常置为NULL SIZE_T dwStackS ...
- PCB 线路铜皮面积(残铜率)计算的实现方法
一个多月没更新博客园了,这里继续分享关于PCB工程相关一些知识,做过PCB工程都知道用使用genesis或incam是可以非常方便的计算得到铜皮面积这个参数[下图],但实际这个软件是通过什么算法计算出 ...
- Unity3D NGUI UIPlayTween(原UIButtonTween)动画事件详解
http://blog.csdn.net/asd237241291/article/details/8507817 原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术 ...