Backbone 模型 - Backbone.Model

2023-10-30

BackBone模型源码 2013-06-06 11:12:01

分类: JavaScript

Backbone 模型 - Backbone.Model


首先是 Model 模块的源码:

  1.   // Backbone **Models** 在框架中是基础的数据对象 --
  2.   // 常常代表你服务器中数据库表中的一行.
  3.   // 为一个离散的数据块,和一堆对这些数据进行计算转换的有用的相关的方法

  4.   // 使用指定的属性创建一个新的模型.
  5.   // 会自动生成并分配一个用户id (`cid`),依赖与 Underscore 的几个方法
  6.   var Model = Backbone.Model = function(attributes, options) {
  7.     var defaults;
  8.     var attrs = attributes || {};
  9.     options || (options = {});

  10.    // Underscore 中生成id的方法
  11.     this.cid = _.uniqueId('c');
  12.     this.attributes = {};

  13.     // 返回 options 中属性存在于 modelOptions 的一个对象
  14.     _.extend(this, _.pick(options, modelOptions));
  15.     if (options.parse) attrs = this.parse(attrs, options) || {};
  16.     if (defaults = _.result(this, 'defaults')) {
  17.       attrs = _.defaults({}, attrs, defaults);
  18.     }
  19.     this.set(attrs, options);
  20.     this.changed = {};
  21.     this.initialize.apply(this, arguments);
  22.   };

模型的构造函数,用于创建各个模型。各个模型都会拥有唯一的 cid , 提供的   modelOptions  列表中的选项将直接连接到原型,其余 options 中的将使用 set 来处理,set是 Model 的核心操作。会触发模型"change"事件。具体属性的话可以在此了解, 拔了一张强大的图~





以下为 Model 模块的原型中的方法,其中的 set 为核心方法,是控制当有属性改变时触发改变对象的 change 事件。 下面为 Model模块的使用以及原型方法的源码。

首先我们在页面上画一个黑色的矩形,并且 id 为 side。 我们使用模型控制进行颜色更改。

  1. // 创建一个 有 changeColor 方法的模型,该方法会调用 set 更改 color 属性,set 会触发实例的 change:color 事件
  2. var Sidebar = Backbone.Model.extend({
  3.     changeColor:function(){
  4.         var cssColor = prompt("输入颜色");
  5.         this.set({color:cssColor});
  6.     }
  7. });

  8. // 建立一个模型的实例
  9. var side = new Sidebar();

  10. // 为该实例绑定 当属性 color 被 set (也就是触发change)后的事件
  11. side.bind("change:color",function(model,color){
  12.     $(".side").css({background:color});
  13.     alert("setted");
  14. });

  15. //然后我们运行 模型实例中的方法
  16. side.changeColor();
虽然感觉过程有点绕,中间有了 Model 这一概念来对事件进行控制,但是这样很好的使我们将结构分离开,容易控制整体以及之后的变更都会变得异常简单。

接下来就是 Model 原型中的方法:


点击(此处)折叠或打开

  1. _.extend(Model.prototype, Events, {

  2.     // 当前与之前值有变化的 属性散列(哈希).
  3.     changed: null,

  4.     // 最后一次验证失败的返回值.
  5.     validationError: null,

  6.     // JSON 默认名称 `id` 属性名为 `"id"`. MongoDB 和
  7.     // CouchDB 用户偏向于 `"_id"`.
  8.     idAttribute: 'id',

  9.     // 默认初始化空函数.
  10.     // 用自己的逻辑初始化重写函数.
  11.     initialize: function(){},

  12.     // 返回一个模型的属性对象的拷贝.
  13.     toJSON: function(options) {
  14.       return _.clone(this.attributes);
  15.     },

  16.     // 默认使用 `Backbone.sync` 代理
  17.     // 如果需要可以自定义从写
  18.     sync: function() {
  19.       return Backbone.sync.apply(this, arguments);
  20.     },

  21.     // 获取属性值
  22.     get: function(attr) {
  23.       return this.attributes[attr];
  24.     },

  25.     // 获取属性的 HTML-escaped 值.
  26.     escape: function(attr) {
  27.       return _.escape(this.get(attr));
  28.     },

  29.     // 若属性值不为 null 或者 undefined 则返回 `true`
  30.     // or undefined.
  31.     has: function(attr) {
  32.       return this.get(attr) != null;
  33.     },

  34.     // 在对象上建立模型的属性哈希, 触发 `"change"`.
  35.     // 这是 模型 的核心操作, 更新数据, 通知那些需要知道 模型 状态变化的对象
  36.     // backbone 野兽的心脏.
  37.     set: function(key, val, options) {
  38.       var attr, attrs, unset, changes, silent, changing, prev, current;
  39.       if (key == null) return this;

  40.       // 处理 `"key", value` 和 `{key: value}` 2种参数形式的情况.
  41.       if (typeof key === 'object') {
  42.         attrs = key;
  43.         options = val;
  44.       } else {
  45.         (attrs = {})[key] = val;
  46.       }

  47.       options || (options = {});

  48.       // 执行验证.
  49.       if (!this._validate(attrs, options)) return false;

  50.       // 提取 属性 和 可选项.
  51.       unset = options.unset;
  52.       silent = options.silent;
  53.       changes = [];
  54.       changing = this._changing;
  55.       this._changing = true;

  56.       if (!changing) {
  57.         this._previousAttributes = _.clone(this.attributes);
  58.         this.changed = {};
  59.       }
  60.       current = this.attributes, prev = this._previousAttributes;

  61.       // 检测 `id` 变化.
  62.       if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];

  63.       // 设置每一个属性, 更新或者删除当前值.
  64.       for (attr in attrs) {
  65.         val = attrs[attr];
  66.         if (!_.isEqual(current[attr], val)) changes.push(attr);
  67.         if (!_.isEqual(prev[attr], val)) {
  68.           this.changed[attr] = val;
  69.         } else {
  70.           delete this.changed[attr];
  71.         }
  72.         unset ? delete current[attr] : current[attr] = val;
  73.       }

  74.       // 触发所用相应的属性改变.
  75.       if (!silent) {
  76.         if (changes.length) this._pending = true;
  77.         for (var i = 0, l = changes.length; i < l; i++) {
  78.           this.trigger('change:' + changes[i], this, current[changes[i]], options);
  79.         }
  80.       }

  81.       // while 循环 修改将被递归嵌套在'events'事件中
  82.       if (changing) return this;
  83.       if (!silent) {
  84.         while (this._pending) {
  85.           this._pending = false;
  86.           this.trigger('change', this, options);
  87.         }
  88.       }
  89.       this._pending = false;
  90.       this._changing = false;
  91.       return this;
  92.     },

  93.     // 从模型中移除一个属性, 触发 `"change"`.
  94.     // `unset` 如果属性不存在设置为空
  95.     unset: function(attr, options) {
  96.       return this.set(attr, void 0, _.extend({}, options, {unset: true}));
  97.     },

  98.     // 清楚模型中的所有属性,触发 `"change"`.
  99.     clear: function(options) {
  100.       var attrs = {};
  101.       for (var key in this.attributes) attrs[key] = void 0;
  102.       return this.set(attrs, _.extend({}, options, {unset: true}));
  103.     },

  104.     // 确保 模型 在上一次更改后再一次更改 `"change"` event.
  105.     // 如果指定了属性名称, 确定属性已经改变.
  106.     hasChanged: function(attr) {
  107.       if (attr == null) return !_.isEmpty(this.changed);
  108.       return _.has(this.changed, attr);
  109.     },

  110.     // 返回一个包含所有改变的属性的对象, 当没有属性被更改,就返回 false.
  111.     // 常用来判断视图块是否需要更新或者那些属性需要保存到后端
  112.     // 未设置的 属性将设置为 undefined.
  113.     // 你也可以针对模型传递一个属性对象来改变,决定是否 *would be* 改变.
  114.     changedAttributes: function(diff) {
  115.       if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
  116.       var val, changed = false;
  117.       var old = this._changing ? this._previousAttributes : this.attributes;
  118.       for (var attr in diff) {
  119.         if (_.isEqual(old[attr], (val = diff[attr]))) continue;
  120.         (changed || (changed = {}))[attr] = val;
  121.       }
  122.       return changed;
  123.     },

  124.     // 获取一个属性之前,在最后一次 'change' 事件触发时候的值
  125.     previous: function(attr) {
  126.       if (attr == null || !this._previousAttributes) return null;
  127.       return this._previousAttributes[attr];
  128.     },

  129.     // 获取上一次 `"change"` 事件时所有属性的值.
  130.     previousAttributes: function() {
  131.       return _.clone(this._previousAttributes);
  132.     },

  133.     // 从服务器端获取 模型 .
  134.     // 如果服务器端的显示的模型与当前属性有区别,那么覆盖并且触发事件"change"`.
  135.     fetch: function(options) {
  136.       options = options ? _.clone(options) : {};
  137.       if (options.parse === void 0) options.parse = true;
  138.       var model = this;
  139.       var success = options.success;
  140.       options.success = function(resp) {
  141.         if (!model.set(model.parse(resp, options), options)) return false;
  142.         if (success) success(model, resp, options);
  143.         model.trigger('sync', model, resp, options);
  144.       };
  145.       wrapError(this, options);
  146.       return this.sync('read', this, options);
  147.     },

  148.     // 设置属性的哈希, 同步模型到服务器.
  149.     // 如果服务器返回一个有区别的属性散列,那么模型的状态要重新设置
  150.     save: function(key, val, options) {
  151.       var attrs, method, xhr, attributes = this.attributes;

  152.       // 处理 `"key", value` and `{key: value}` 2种参数情况.
  153.       if (key == null || typeof key === 'object') {
  154.         attrs = key;
  155.         options = val;
  156.       } else {
  157.         (attrs = {})[key] = val;
  158.       }

  159.       // 如果并不在等待队列中并且属性不存在, 保存行为以 `set(attr).save(null, opts)`格式.
  160.       if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;

  161.       options = _.extend({validate: true}, options);

  162.       // 舍弃无效的模型 .
  163.       if (!this._validate(attrs, options)) return false;

  164.       // 如果 `{wait: true}` 设置临时属性.
  165.       if (attrs && options.wait) {
  166.         this.attributes = _.extend({}, attributes, attrs);
  167.       }

  168.       // 在服务器端保存成功后, 客户端可以与服务器端一起更新(可选)
  169.       if (options.parse === void 0) options.parse = true;
  170.       var model = this;
  171.       var success = options.success;
  172.       options.success = function(resp) {
  173.         // 确保属性在同步保存的时候可恢复.
  174.         model.attributes = attributes;
  175.         var serverAttrs = model.parse(resp, options);
  176.         if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
  177.         if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
  178.           return false;
  179.         }
  180.         if (success) success(model, resp, options);
  181.         model.trigger('sync', model, resp, options);
  182.       };
  183.       wrapError(this, options);

  184.       method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
  185.       if (method === 'patch') options.attrs = attrs;
  186.       xhr = this.sync(method, this, options);

  187.       // 恢复属性.
  188.       if (attrs && options.wait) this.attributes = attributes;

  189.       return xhr;
  190.     },

  191.     // 去除以及存在在服务器端的模型.
  192.     // 如果集合中原有一个模型,那么去掉就好.
  193.     // 如果 `wait: true` 传递过来, 在移除之前等待服务器响应.
  194.     destroy: function(options) {
  195.       options = options ? _.clone(options) : {};
  196.       var model = this;
  197.       var success = options.success;

  198.       var destroy = function() {
  199.         model.trigger('destroy', model, model.collection, options);
  200.       };

  201.       options.success = function(resp) {
  202.         if (options.wait || model.isNew()) destroy();
  203.         if (success) success(model, resp, options);
  204.         if (!model.isNew()) model.trigger('sync', model, resp, options);
  205.       };

  206.       if (this.isNew()) {
  207.         options.success();
  208.         return false;
  209.       }
  210.       wrapError(this, options);

  211.       var xhr = this.sync('delete', this, options);
  212.       if (!options.wait) destroy();
  213.       return xhr;
  214.     },

  215.     // 模型在服务器端表示的默认的URL -- if you're
  216.     // 如果你在使用 Backbone's 静态方法, 重写此方法来改变将被调用的端点.
  217.     url: function() {
  218.       var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
  219.       if (this.isNew()) return base;
  220.       return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
  221.     },

  222.     // **parse** 响应转换成模型上的哈希
  223.     // 默认只是实现通过响应.
  224.     parse: function(resp, options) {
  225.       return resp;
  226.     },

  227.     // 创建一个新的 和当前模型有一样属性的模型.
  228.     clone: function() {
  229.       return new this.constructor(this.attributes);
  230.     },

  231.     // 如果一个模型还没有存到服务器,那么他就是新的, 没有id.
  232.     isNew: function() {
  233.       return this.id == null;
  234.     },

  235.     // 检查模型当前是不是有效状态.
  236.     isValid: function(options) {
  237.       return this._validate({}, _.extend(options || {}, { validate: true }));
  238.     },

  239.     // 对下一个完全设置了模型属性的进行验证
  240.     // 返回'true'. 否则触发 `"invalid"` 事件.
  241.     _validate: function(attrs, options) {
  242.       if (!options.validate || !this.validate) return true;
  243.       attrs = _.extend({}, this.attributes, attrs);
  244.       var error = this.validationError = this.validate(attrs, options) || null;
  245.       if (!error) return true;
  246.       this.trigger('invalid', this, error, _.extend(options || {}, {validationError: error}));
  247.       return false;
  248.     }

  249.   });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Backbone 模型 - Backbone.Model 的相关文章

  • TFT显示RGB颜色24位转16位,Java代码实现

    1 背景 在做TFT显示屏驱动的时候 遇到了颜色转换的问题 我们正常的RGB颜色是24位 3 8 24 RGB三色各8bit位 但是TFT显示颜色是16位 需要进行转换才能使用 2 转换原理 如何将24位RGB颜色转换16位RGB颜色 走看
  • 不得不会的23种Java设计模式(六)——享元模式

    享元模式 一 定义 二 享元模式和单例模式的区别 三 案例 四 总结 一 定义 享元模式是构造型模式之一 它通过共享数据使得相同对象在内存中仅创建一个实例 以降低系统创建对象实例的性能消耗 二 享元模式和单例模式的区别 单例是该类创建自己的
  • 1176: 查找最大字符串(指针专题)

    1176 查找最大字符串 指针专题 题目描述 从键盘上输入多个字符串 每个串不超过5个字符且没有空格 用 作为串输入结束的标记 从所输入的若干字符串中 找出一个最大的串 并输出该串 要求最大串的查找通过调用编写的函数实现 void find
  • 【JS逆向】之过无限debugger调试

    在JS逆向过程当中 获取用发F12抓取XHR的时候 常常会发现网页不让我们打开F12开发人员工具 如果这个时候我们开启工具中禁止断点之后 虽然我们可以抓取xhr 但是这样我们无法调试代码部分了 开启了禁止断点之后 我们自己也无法在代码当中下
  • crash工具分析大型Linux服务器死锁实战

    Linux服务器背景 CPUS 40 MEMORY 127 6 GB MACHINE x86 64 2199 Mhz Linux Kernel 4 4 121 TASKS 19411 其实这不算大型服务器 我见过大型的一般内存4T起步 30
  • CTFHUB-Git泄露

    首先下载GitHack git clone https github com BugScanTeam GitHack Log 访问网站 Where is flag 直接上GitHack python2 7 GitHack py 靶机网址 g
  • 人脸分割学习笔记

    目录 轻量级分割网络汇总 人脸抠图 宣传效果特别好 人脸分割BiseNetV2 Training dataset 人脸关键点数据集 轻量级分割网络汇总 轻量级分割网络总结 jacke121的专栏 CSDN博客 轻量级分割网络 人脸抠图 宣传
  • java.io.FileNotFoundException: File does not exist:

    Sqoop从mysql导入文件到hdfs 报错 ERROR tool ImportTool Import failed java io FileNotFoundException File does not exist hdfs cdh1
  • C++笔记7:多态笔记再整理、多态原理,关于虚函数表,C++对象的内存布局

    笔记6中继承与多态都是比较基础的 也并不清楚很多原理 觉得深一点可能就不会了 可是多态又很重要 所以二一下 之后上完课再看看要不要补充个3 加油 关于多态 就是用父类型别的指针指向其子类的实例 然后通过父类的指针调用实际子类的成员函数 这种
  • 【vue】笔记三:Vue基础语法以及数据绑定

    Vue相关的所有语法及其数据绑定 一 语法指令 1 插值 2 v bind指令 3 v model指令 4 计算属性 5 监听器 6 响应式数据 7 生命周期钩子函数 8 指令 二 数据绑定 1 单向数据绑定 2 双向数据绑定 一 语法指令
  • U-boot中LPDDR4关键参数的意义

    LPDDR4关键参数意义 usr bin env python3 import struct 手动配置 0 disable 1 enable manual config 0 DDR的数据位宽 data width 32 channel个数
  • vue使用高德地图点聚合,点击显示弹窗

    高德地图点聚合 点击地图上的点展示弹窗 再根据不同类型展示不同的图片 html div class public map div js 官网需要的数据格式 export default data return maplist map nul
  • Vue-admin-template笔记(一)

    Vue admin template项目 一 关于Vue admin template 1 1 介绍 vue element admin 是一个后台前端解决方案 它基于 vue 和 element ui实现 可以把 vue element
  • 图片转换成16进制数据,在显示成图片

    1 目的 在串行 或者网络通信的时候 往往需要把图片解析成16进制的数据 方便数据的传输 而在另一端接收到数据后 在将接收到的数据显示成图片 2 代码 include mainwindow h include ui mainwindow h
  • 机械革命蛟龙16Windows重装流程

    1 必要文件的拷贝 将桌面以及D盘一些重要文件拷贝入移动硬盘 2 重装 利用的是Win11自带的系统重装功能 设置 gt Windows更新 gt 高级选项 gt 恢复 gt 重置此电脑中的初始化电脑 gt 删除所有内容 gt 本地重新安装
  • rabbitmq安装

    1 安装 1 1 安装Erlang gt yum install y gcc gcc c glibc devel make ncurses devel openssl devel autoconf java 1 8 0 openjdk de
  • Linux下安装mysql

    1 下载 http dev mysql com downloads mysql 或者使用wget下载 wget http dev mysql com get Downloads MySQL 5 6 MySQL 5 6 22 1 el6 i6
  • 【MySQL入门到精通-黑马程序员】MySQL基础篇-概述及MySQL环境配置

    文章目录 前言 一 MySQL概述 1 1 数据库相关概念 1 2 MySQL数据库 二 数据模型 三 总结 前言 本专栏文章为观看黑马程序员 MySQL入门到精通 所做笔记 课程地址在这 如有侵权 立即删除 一 MySQL概述 1 1 数
  • SCI数据库使用手册(无图版)

    含图笔记在有道云笔记中 https note youdao com s O3YuEZJc 文章目录 1 SCI数据库的简介 对应作业3的第一问 2 打开SCI检索 对应作业3的第一问 3 关键词检索 以KBQA为例 对应作业3的第二问 3
  • Android获取当前位置(GPS和网络定位)

    1 比较 GPS准确度高但耗电多 网络定位耗电少但准确度低 2 代码 添加权限 AndroidManifest xml

随机推荐

  • vue使用百度地图(标点、点击后展示弹框、多个标点、点聚合)

    安装百度地图 npm install vue baidu map save 在百度地图开放平台申请AK 全局注册 在项目的main js中引入 import Vue from vue import baiduMap from vue bai
  • Shell脚本编写教程【五】——Shell 基本运算符

    Shell脚本编写教程 五 Shell 基本运算符 目录 https blog csdn net shn111 article details 131590488 参考教程 https www runoob com linux linux
  • 练习-Java类和对象之包的定义

    第1关 练习 Java类和对象之包的定义 任务描述 编程要求 测试说明 任务描述 本关任务 定义一个电影类和一个电影测试类 在电影测试类中通过对象完成成员变量和成员方法的使用 编程要求 仔细阅读右侧编辑区内给出的代码框架及注释 在 Begi
  • 【Docker】Docker网络

    1 配置容器网络 1 通过实训平台进入到操作系统界面 在 后输入docker run i t d net none ubuntu bin bash命令 启动一个 bin bash容器 示例代码如图1所示 2 在 后输入docker ps a
  • ant-vue中的a-icon使用方法

    Ant Design 图标库 直接引入的使用方式 你直接点击相应的图标会自动将图标名称复制到你的剪切板上
  • Unity3D游戏开发介绍

    Unity3D游戏开发介绍 Unity3D Unity是实时3D互动内容创作和运营平台 包括游戏开发 美术 建筑 汽车设计 影视在内的所有创作者 借助Unity将创意变成现实 Unity平台提供一整套完善的软件解决方案 可用于创作 运营和变
  • CenOS7 下安装wget命令

    1 安装vsfdp yum y install vsftpd 2 关闭防火墙 systemctl stop firewalld service 3 将本机目录下的wget安装文件上传至虚拟机 scp wget 1 14 18 el7 6 1
  • 案例:用户信息列表展示

    1 需求 用户信息的增删改查操作 2 设计 1 技术选型 Servlet JSP MySQL JDBCTempleat Duird BeanUtilS tomcat 2 数据库设计 create database day17 创建数据库 u
  • uva11292 Dragon of Loowater (水题)

    include
  • 电脑怎么在Bios中开启虚拟化

    1 开机按F1进入BIOS Configuration Secuity 2 然后选择Virtulize 或者Intel Virtual Technolody 设置成Enable 3 F10保存 重启
  • String类为什么是不可变的

    String StringBuilder StringBuffer是经常考的东西 其中 String是不可变的 为什么呢 简单解释如下 String类new了一个对象后 我们看到的该对象只是引用 存放了真正内存的地址 并不是真的内存值 如果
  • 500.键盘行 693.交替位二进制数(java实现)

    键盘行 题目 给定一个单词列表 只返回可以使用在键盘同一行的字母打印出来的单词 键盘如下图所示 示例1 输入 Hello Alaska Dad Peace 输出 Alaska Dad 注意 你可以重复使用键盘上同一字符 你可以假设输入的字符
  • 瑞芯微RK3399交叉编译MPP

    上一篇介绍了如何在ubuntu下搭建瑞芯微RK3399的检查编译环境 现在就要开始交叉编译MPP来进行对视频的硬编硬解 这里RK3399用的aarch64架构芯片 上面跑的linux 如果编译android版 需要其他配置 这里主要对lin
  • 101. Symmetric Tree\104. Maximum Depth of Binary Tree\111. Minimum Depth of Binary Tree

    Symmetric Tree 题目描述 代码实现 Maximum Depth of Binary Tree 题目描述 代码实现 Minimum Depth of Binary Tree 题目描述 代码实现 101 Symmetric Tre
  • hcie数通认证考试科目有哪些

    HCIE数通认证考试科目包括网络架构设计和规划 华为路由交换设备的技术和应用 安全和防护 数据中心技术和架构设计以及其他技术和应用1 网络架构设计和规划是HCIE认证考试的重点内容之一 包括网络结构的分层设计 网络拓扑规划 网络性能和可靠性
  • 器件基础知识——电阻

    一 认识电阻 1 耗能能力 电阻对电流有阻碍作用 它自身消耗能量 会将电能转换为热能 为热功率 为流过电阻的电流 为电阻阻值 2 欧姆定律 为加在电阻两端的电压 在电路中为固定值 3 等效模型 理想的电阻器 由纯电阻组成 不受工作频率影响
  • Docker安装教程

    0 安装Docker Docker 分为 CE 和 EE 两大版本 CE 即社区版 免费 支持周期 7 个月 EE 即企业版 强调安全 付费使用 支持周期 24 个月 Docker CE 分为 stable test 和 nightly 三
  • 一个简单的神经网络实例——两层神经网络手写数字识别

    简介 这里是使用神经网络识别手写数字的教程 这个简单的神经网络教程演示了使用numpy从零开始实现一个简单的神经网络 我们定义前向传播和反向传播函数 在训练过程中不断更新权重 完成对数据的拟合 1 准备数据 我们准备了一个简单的训练集 包含
  • 三种素数筛总结——(朴素筛,埃氏筛,线性筛)

    但行好事 莫问前程 题目背景 题目 leetcode 204 计数质数 给定整数 n 返回 所有小于非负整数 n 的质数的数量 对于这类求解素数个数有关的题目 通常采用质数筛算法 本文不计算时间复杂度 只介绍自己对于思路的理解 质数筛 1
  • Backbone 模型 - Backbone.Model

    BackBone模型源码 2013 06 06 11 12 01 分类 JavaScript Backbone 模型 Backbone Model 首先是 Model 模块的源码 Backbone Models 在框架中是基础的数据对象 常