[关闭]
@xiaoqq 2016-08-29T12:08:04.000000Z 字数 2103 阅读 874

JavaScript语言精粹读书笔记

JavaScript


一、引言

JavaScript有非常精华的部分,有一些优秀的想法。这些优秀的想法包括:函数、弱类型、动态对象和对象字面量:

二、语法

三、对象

  1. JavaScript中的对象是可变键值对集合(keyed collections)。对象是属性的容器,一个对象的属性名可以是任何有效的 JavaScript 字符串,,或者可以被转换为字符串的任何东西,包括空字符串。然而,一个属性的名称如果不是一个有效的 JavaScript 标识符(例如,一个有空格或短横线,或者以数字开头的属性名),就只能通过方括号标记访问。

  2. JavaScript中的属性名都是以String类型来进行存储,对于引用类型,会自动调用toString()方法,转成"[object Object]",对于基本类型则不会转,我也不知道为什么...

  3. hasOwnProperty方法可以检测对象的独有属性,如果是,则返回truehasOwnProperty不会检查原型链。

  4. for in可以用来枚举对象的所有属性,但是这些属性名出现的顺序是不确定的。

  5. 定义getter和setter,创建访问器属性;同时,也有两个非标准的方法:__defineGetter____defineSetter__可以实现类似功能。当然,可以通过defineProperty来创建访问器属性。

  1. js> var o = {a: 7, get b() {return this.a + 1;}, set c(x) {this.a = x / 2}};
  2. [object Object]
  3. js> o.a;
  4. 7
  5. js> o.b;
  6. 8
  7. js> o.c = 50;
  8. js> o.a;
  9. 25

Object函数的方法:

  1. Object.assign(target, ...sources)通过复制一个或多个对象来创建一个新的对象。

    1. var o1 = { a: 1 };
    2. var o2 = { b: 2 };
    3. var o3 = { c: 3 };
    4. var obj = Object.assign(o1, o2, o3);
    5. console.log(obj); // { a: 1, b: 2, c: 3 }
    6. console.log(o1); // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。
  2. Object.create()指定原型对象和属性来创建一个新的对象。

  3. Object.freeze()冻结对象:使对象不可删除或修改它的属性。

  4. Object.getOwnPropertyNames()返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名。

  5. Object.getPrototypeOf() 方法返回指定对象的原型(也就是该对象内部属性[[Prototype]]的值)。

  6. Object.is()判断两个值是否严格相等。(类似===运算符,但+0不等于-0,NaN等于自己)。

  7. Object.keys()返回一个数组,包含指定对象的所有自有可遍历属性的名称。

对象实例和对象原型对象

  1. Object.prototype.constructor特定的函数,用于创建一个对象的原型。

四、函数

JavaScript设计地最出色的就是它的函数实现。----《JavaScript语言精粹》

  1. 函数包含一组语句,它们是JavaScript的基础模块单元,用于代码复用、信息隐藏和组合调用。函数用于指定对象的行为。一般来说,所谓的编程就是将一组需求分解成一组函数和数据结构的功能。

  2. 每个函数被创建时会附加两个隐藏属性:函数的上下文和实现函数的代码。

  3. 函数是一个对象,与众不同的就是函数可以被调用。

  4. JavaScript中函数被调用的四种模式:方法调用,函数调用,构造器调用和apply调用。

五、继承

  1. 基于类的语言中,类有两个作用:代码重用和类型系统的规范。但是JS作为一门弱类型的语言,不需要类型转换,所以对象继承的关系并不是那么重要。对于一个对象来说,重要的是它能做什么,而不是他从哪里来。

  2. 调用构造器创建函数的步骤:

    1. Function.prototype.new = function() {
    2. //创建一个继承自构造函数原型的对象
    3. var that = Object.create(this.prototype);
    4. //调用构造函数,将this绑定到新的对象上
    5. var other = this.apply(that, arguments);
    6. //如果函数执行的结果不为对象,则返回that
    7. return (typeof other === "object" && other) || that;
    8. }
  3. 实际上,并不需要通过上述的方式。在一个纯粹的原型模式中,我们会摒弃类,而专注于对象。基于原型的继承。

  4. 继承模型有一个弱点就是没法保护隐私

六、数组

  1. 数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素。但是,JS中并没有像此类数组一样的数据结构。作为替代,JavaScript提供了一些类数组(array-like)特性的对象,

TODO

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注