Single Page Web Applications 阅读思考笔记

Oct 5, 2016

Single Page Web Applications 简称 SPA(单页Web应用),Web2.0时代的产物。它可能会提高开发成本,但那趋近于原生应用的效果还是令人心驰神往。

简介

内容

//es5关于此函数的实现,此函数的注释来自MDN
if (typeof Object.create != 'function') {
  Object.create = (function() {
    //为了节省内存,使用一个共享的构造器
    function Temp() {}
    // 使用 Object.prototype.hasOwnProperty 更安全的引用 
    var hasOwn = Object.prototype.hasOwnProperty;

    return function (O) {
      // 1. 如果 O 不是 Object 或 null,抛出一个 TypeError 异常。
      if (typeof O != 'object') {
        throw TypeError('Object prototype may only be an Object or null');
      }

      // 2. 使创建的一个新的对象为 obj ,就和通过
      //    new Object() 表达式创建一个新对象一样,
      //    Object是标准内置的构造器名
      // 3. 设置 obj 的内部属性 [[Prototype]] 为 O。
      Temp.prototype = O;
      var obj = new Temp();
      Temp.prototype = null; // 不要保持一个 O 的杂散引用(a stray reference)...

      // 4. 如果存在参数 Properties ,而不是 undefined ,
      //    那么就把参数的自身属性添加到 obj 上,就像调用
      //    携带obj ,Properties两个参数的标准内置函数
      //    Object.defineProperties() 一样。
      if (arguments.length > 1) {
        // Object.defineProperties does ToObject on its first argument.
        var Properties = Object(arguments[1]);
        for (var prop in Properties) {
          if (hasOwn.call(Properties, prop)) {
            obj[prop] = Properties[prop];
          }
        }
      }

      // 5. 返回 obj
      return obj;
    };
  })();
}

//创建对象,它有一个可写的,可枚举的,可配置的属性p
var o = Object.create({}, {
    p: {
        value: 42,
        writable: true,
        enumerable: true,
        configurable: true
    }
});
//如果省略了的属性特性(writable、enumerable、configurable)默认为false,所以属性p是不可写,不可枚举,不可配置的
o = Object.create({}, {
    p: {
        value: 42
    }
})
o.p = 24
o.p
//42

//此特性还可以通过Object.defineProperties(obj, props)来设置(在一个对象上添加或修改一个或者多个自有属性,并返回该对象)
window.onhashchange = function(){
  alert(location.hash);
}
function demo() {
  var initModule, removeSlider;
  initModule = function () {
     //...
  };
  removeSlider = function () {
     //...
  };
  return {
     initModule: initModule,
     removeSlider: removeSlider
  };
}

关于数据驱动+单向数据流+模块化开发的几点心得与杂记

–源于一个已经用于生产环境的手写的小框架
  1. 数据源唯一,所有的页面模块的渲染都是依赖这个数据源
  2. 每一个“页面模块”的函数中只应该存在简单的if判断和dom操作(职责单一,我就管我这块的页面显示)
  3. 需要保证当数据源中的数据对象发生变化时,使用这个数据对象的“页面模块”函数自动执行(需自动建立映射关系)
  4. 所有的dom操作都应该都应该被封装在“页面模块”函数中
  5. 所有需要调整页面展示的地方,都需要通过修改数据源中的数据,来通过因果关系,使数据“流”向具体“页面模块”
  6. 每个页面模块都应该显式的对应“一块”dom元素
  7. 数据源的设计决定了整个项目的结构,数据源应遵循“类数据库式的设计范式”,扁平化无对象嵌套(危险的对象引用传递)
  8. 我理解的框架就是“约定好的项目构建方式+公共模块类库+人为的约束”
  9. 特点:以小部分性能的损失来换取开发的便捷,模块功能职责单一
  10. 职责单一