js:语言精髓笔记12--动态语言特性(2)

时间:2024-01-08 15:36:44

对于括号内:

  • 通过赋值时发生的重写:
(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;