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对象

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和Model.extend

看一下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||{};//1
options|(options={});//2

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

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‘);//25
时间: 2024-12-28 14:49:17

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

Backbone学习记录(6)

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

Backbone学习记录(7)

事件委托 <form> <input type="text" class="txt"> <input type="button" class="btn" value="确认"> </form> <span class="input-data"></span> var FormView=Backbone.View.ex

Backbone学习记录(5)

数据与服务器 var User=Backbone.Model.extend({ defaults:{ name:'susan', age:18 }, url:'/user'//数据提交的路径 }); var user=new User({name:'lily'}); user.save();//将数据保存到服务器 从这里可以看到,user.save()执行是将数据提交到了user.url. to be continue...

Backbone学习记录(4)

change事件:"change" (model, options) — 当attributes变化时"change:[attribute]" (model, value, options) — 当attributes的一个特定属性变化时listenTo事件:view.listenTo(model, 'change', view.render); 第一个参数是模块,第二个参数是事件类型,第三个参数是事件回调. change与listenTo的区别是后者改写了this

Backbone学习记录(3)

创建视图 同前面创建模型和集合的方式一样,Backbone.View.extend()即可创建视图 var UserView=Backbone.View.extend(); var view1=new UserView(); 生成的实例是这样一个对象,el应该是js原生的对象,$el应该是jQuery对象,很方便,不需要我再去$(el).验证一下: view1.el.innerText="111"; //"111" view1.$el //[<div>?

Backbone学习记录(2)

创建一个集合 var User=Backbone.Model.extend({}); var List=Backbone.Collection.extend({model:User}); 为集合添加模型1.new 时添加 var User=Backbone.Model.extend({}); var List=Backbone.Collection.extend({model:User}); var user1=new List({'name':'susan'}); var user2=new

Backbone 学习笔记

Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用. 借助Backbone 我们可以使用REST的方式来最小化客户端和服务器间的数据传输,从而实现了更快加速的Web页面更新. 能心静下来学习了,以前以为Backbone 是一座高山用起来很难,结果只是学了2天就有一些新的,实在让人开心. 我整理了一下整个BackBone的学习记录在我的GIT里面,大部分事件都有例子并且有详细的注解和解释,结合require.js

Python学习记录-2016-12-17

今日学习记录 模块: import os#导入os模块 import sys#导入sys模块 os.system("df -h")#执行df -h命令 cmd_res = os.popen("df -h").read()#将命令的返回结果赋值给cmd_res,如果不加入.read()会显示命令的返回加过在内存的位置 print(sys.path)#显示系统变量路径,一般个人模块位于site-packages下,系统模块位于lib下 print(sys.argu[2]

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac