对于括号内:
- 通过赋值时发生的重写:
(Object1 = function() {}).prototype.value = 100;
var obj1 = new Object1;
console.log(obj1.value); // 100
- 语法声明阶段的重写: //会报错,一般引擎不承认在表达式中声明的标识符;
(function Object2() {}).prototype.value = 100;
重写:
- 对内部对象系统的影响:
- 重写内置构造器:任意构造器的原型属性不受内置构造器重写的影响,它总是创建自一个系统引擎中的构造器;
- 重写内置构造器的原型:会影响内部对象系统;
- 对象类型的直接量声明,与它的构造类直接绑定;
- 对象成员的重写:
- 重写检测:hasOwnProperty,检查是否重写了继承属性,注意前提是维护有效的原型链;
- 重写删除:
- delete obj1.name //删除自有的;
- delete obj1.constructor.prototype.name //删除继承的;
//删除obj原型链中最近的那个prop属性;
function deleteProperty(obj, prop) {
if (prop in obj) {
do {
if (obj.hasOwnProperty(prop)) break;
}
while (obj.constructor && (obj = obj.constructor.prototype));
}
delete obj[prop];
}
- 宿主对重写的限制:
- 涉及维护引用;
- 涉及触发行为;
- 引擎对重写的限制:
- this不能被重写;
包装类:
- JS中存在两套类型系统:元类型系统和对象类型系统;为了实现一切都是对象,JS将元类型数据(boolean,number,string)通过包装类编程对象数据来处理;
- 包装:
- 显示包装:
- 隐式包装:
- 元数据如果是用普通求值运算或复制运算,则是以非对象的形式;
- 元对象的隐式包装总是发生在成员存取运算符中;
JS统一语言范型的基本模型:
- 一切都是对象: aFunc instanceof Object == true;
- 对象由函数构造: aObj = new aFunc();
关联数组:
- 分类:索引数组、关联数组;
- 关联数组是实现对象系统的基础,JS中对象(的原型)所持有的属性表,就是一个关联数组的内存表达式:
- 属性存取,就是查表;
- 对象实例,就是一个可以动态添加元素的关联数组;
- 原型继承,就是在继承链的关联数组中查找元素;
值运算:
- 隐式转换:
- 运算导致://通常语法分析期,JS引擎首先解析运算符,并将其操作的运算元(标识符或直接量)置入语法树,但这一过程并不对运算元做类型推定;在执行期,引擎执行语法树运算,先根据元算符所支持的元算元类型进行一次操作数的隐式转换;
- 语义导致: //一些语句在语义分析时也会做一些强制转换操作; //if,while等;
- 值类型之间的转换:
- undefined: //任何其它类型都不会转换为undefined
- 'undefined';
- NaN;
- false;
- number: //任何值都会转换到number,至少是NaN;
- undefined: //任何其它类型都不会转换为undefined