@xiaoqq
2016-08-29T12:08:04.000000Z
字数 2103
阅读 874
JavaScript
JavaScript有非常精华的部分,有一些优秀的想法。这些优秀的想法包括:函数、弱类型、动态对象和对象字面量:
JavaScript中的对象是可变的键值对集合(keyed collections)。对象是属性的容器,一个对象的属性名可以是任何有效的 JavaScript 字符串,,或者可以被转换为字符串的任何东西,包括空字符串。然而,一个属性的名称如果不是一个有效的 JavaScript 标识符(例如,一个有空格或短横线,或者以数字开头的属性名),就只能通过方括号标记访问。
JavaScript中的属性名都是以String类型来进行存储,对于引用类型,会自动调用toString()方法,转成"[object Object]"
,对于基本类型则不会转,我也不知道为什么...
hasOwnProperty
方法可以检测对象的独有属性,如果是,则返回true
。hasOwnProperty
不会检查原型链。
for in
可以用来枚举对象的所有属性,但是这些属性名出现的顺序是不确定的。
定义getter和setter,创建访问器属性;同时,也有两个非标准的方法:__defineGetter__
和__defineSetter__
可以实现类似功能。当然,可以通过defineProperty
来创建访问器属性。
js> var o = {a: 7, get b() {return this.a + 1;}, set c(x) {this.a = x / 2}};
[object Object]
js> o.a;
7
js> o.b;
8
js> o.c = 50;
js> o.a;
25
Object.assign(target, ...sources)
通过复制一个或多个对象来创建一个新的对象。
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。
Object.create()
指定原型对象和属性来创建一个新的对象。
Object.freeze()
冻结对象:使对象不可删除或修改它的属性。
Object.getOwnPropertyNames()
返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名。
Object.getPrototypeOf()
方法返回指定对象的原型(也就是该对象内部属性[[Prototype]]的值)。
Object.is()
判断两个值是否严格相等。(类似===运算符,但+0不等于-0,NaN等于自己)。
Object.keys()
返回一个数组,包含指定对象的所有自有可遍历属性的名称。
Object.prototype.constructor
特定的函数,用于创建一个对象的原型。JavaScript设计地最出色的就是它的函数实现。----《JavaScript语言精粹》
函数包含一组语句,它们是JavaScript的基础模块单元,用于代码复用、信息隐藏和组合调用。函数用于指定对象的行为。一般来说,所谓的编程就是将一组需求分解成一组函数和数据结构的功能。
每个函数被创建时会附加两个隐藏属性:函数的上下文和实现函数的代码。
函数是一个对象,与众不同的就是函数可以被调用。
JavaScript中函数被调用的四种模式:方法调用,函数调用,构造器调用和apply调用。
基于类的语言中,类有两个作用:代码重用和类型系统的规范。但是JS作为一门弱类型的语言,不需要类型转换,所以对象继承的关系并不是那么重要。对于一个对象来说,重要的是它能做什么,而不是他从哪里来。
调用构造器创建函数的步骤:
Function.prototype.new = function() {
//创建一个继承自构造函数原型的对象
var that = Object.create(this.prototype);
//调用构造函数,将this绑定到新的对象上
var other = this.apply(that, arguments);
//如果函数执行的结果不为对象,则返回that
return (typeof other === "object" && other) || that;
}
实际上,并不需要通过上述的方式。在一个纯粹的原型模式中,我们会摒弃类,而专注于对象。基于原型的继承。
继承模型有一个弱点就是没法保护隐私