理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)(下)

简介: 理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)(下)

对象关联


  • • 现在我们了解了 [[Prototype]] 机制就是存在于对象中的一个内部链接,他会引用到其他对象。
  • • 何为原型链?
  • • 如果在对象上没有找到需要的属性或方法引用,引擎就会先会在当前对象中查找,如果找不到,就在 [[Prototype]] 关联的对象进行查找。如果后者也没有找到需要的引用就会继续查找它的 [[Prototype]],直到 Object.prototype 为止。以此类推,这一系列的对象链接被称为 "原型链"。


创建关联


  • • 那 [[Prototype]] 机制的意义是什么?为什么要创建这些关联呢?
  • • 如下代码:
var foo = {
    something: function(){
        console.log('do something');
    }
};
var bar = Object.create(foo);
var.something(); // do something
  • • 使用 Object.create() 创建了一个新对象且关联到 foo,这样就可避免一些不必要的麻烦(比如使用 new 的构造函数调用会生成 .prototype 和 .constructor 引用)
  • • 注意:Object.create(null) 会创建一个空链接的对象,因为是空的,所有无法进行委托,并且由于这个对象没有原型链,在使用 instanceof 时也就无法进行判断,因此他们总是会返回 false。
  • • 在上述的代码中我们通过创建一个新的类来创建两个对象之间的关系,其实并不需要这么做,只需要通过委托关系来关联对象就足够了。
// Object.create()的 polyfill 代码
if(Object.create){
    Object.create = function(o){
        function F(){};
        F.prototype = o;
        return new F();
    }
}
  • • 上述代码使用一个一次性函数 F, 通过改写它的 .prototype 属性使其指向想要关联的对象,然后再使用 new F() 来构造一个新对象进行关联。
  • • Object.create() 的扩展:
var anotherObject = {
    a:2
};
var myObject = Object.create( anotherObject, {
    b: {
        enumerable: false,
        writable: true,
        configurable: false,
        value: 3
    },
    c: {
        enumerable: true,
        writable: false,
        configurable: false,
        value: 4
    }
});
myObject.hasOwnProperty( "a" ); // false
myObject.hasOwnProperty( "b" ); // true
myObject.hasOwnProperty( "c" ); // true
myObject.a; // 2
myObject.b; // 3
myObject.c; // 4
  • • Object.create() 的第二个参数指定了需要添加到新对象中的属性名以及这些属性的属性描述符。


小结


  1. 1. 当访问对象中不存在的一个属性时,[[Get]] 操作就会查找对象内部 [[Prototype]] 关联的对象,这个关联关系就是一条 "原型链"(有点像嵌套的作用域),在找到属性时会对它进行遍历。
  2. 2. 所有普通对象都有内置的 Object.prototype,指向原型链的顶端(比如说全局作用域), 如果在原型链中找不到指定的属性就会停止。
  3. 3. 关联两个对象最常用的方法就是用 new 关键字进行函数调用,在调用的第四个步骤中会创建一个关联到创建的新对象。
  4. 4. 使用 new 调用函数时会把新对象的 .prototype 属性关联到其他对象,带 new 的函数调用被称为构造函数调用
  5. 5. 对象之间是通过 [[Prototype]] 链关联的。
  6. 6. Object.create(null) 会创建一个空链接的对象,因为是空的,所有无法进行委托,并且由于这个对象没有原型链,在使用 instanceof 时也就无法进行判断,因此他们总是会返回 false。
  7. 7. 如果对象中的属性不直接存在于当前对象中而是存在于原型链上层时会出现三种情况:
  1. 1. 如果在 [[Prototype]] 原型链上层存在对象中的属性访问属性,并且没有被标记为只读(writable: false),那就会直接在当前对象中添加一个对象中的属性属性,则它是屏蔽属性。
  2. 2. 如果在 [[Prototype]] 原型链上存在对象中的属性属性,但是被标记为只读, 那就无法修改已有属性或在当前对象上创建屏蔽属性。如果在严格模式下运行,会直接抛出一个错误。否则,这条赋值语句就会被忽略。总之,不会发生屏蔽。
  3. 3. 如果在 [[Prototype]] 原型链上层存在对象中的属性并且它是一个 setter,那就一定会调用这个 setter。对象中的属性不会被添加到(可以说屏蔽到)当前对象中,也不会重新定义对象中的属性这个 setter
  1. 8. 使用 for...in 遍历对象和 in 操作符时都会查找对象的整条原型链。(无论属性是否可枚举)
  2. 9. 一个类其实就是一张蓝图,只是一个计划,并不是真正的可以交互的对象,我们必须通过实例化来调用所有公有数据属性,而这个实例化对象就是类的所有特性的一份副本
  3. 10. 多态:父类的一些通用行为可以被子类的行为重写。
  4. 11. 多态并不表示父类和子类有关联,子类得到只是父类的一个副本,类的继承就是复制。


特殊字符描述


问题标注 Q:(question)答案标注 R:(result)注意事项标准:A:(attention matters)详情描述标注:D:(detail info)总结标注:S:(summary)分析标注:Ana:(analysis)提示标注:T:(tips)

目录
相关文章
|
8月前
|
机器学习/深度学习 存储 设计模式
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
317 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
|
12月前
|
消息中间件 存储 SQL
关于Lindorm Ganos
Lindorm 是阿里云推出的云原生超融合多模数据库,集成了宽表、时序、搜索、文件等多种引擎。深度融合的 Lindorm Ganos 时空数据库引擎,能够高效处理海量移动对象的存储、管理和查询需求,弥补了 NoSQL 数据库在时空数据处理上的不足。Ganos 具备原生时空数据类型、多层级索引能力和广适应兼容性,支持标准 SQL 语法,显著提升了计算效率和查询性能。相较传统方案,Ganos 在多种场景下性能提升 3-5 倍,并大幅降低存储计算成本。
417 0
|
JavaScript Java 测试技术
基于微信小程序的小区租拼车管理信息系统设计附带源码和文章说明
基于微信小程序的小区租拼车管理信息系统设计附带源码和文章说明
177 2
|
存储 数据管理 程序员
C++一分钟之-结构体与联合体(Union)
【6月更文挑战第20天】在C++中,结构体(struct)用于组合多种数据类型形成复合类型,成员变量占用独立内存,适合存储不同类型且同时有效的数据。联合体(union)则让所有成员共享同一内存,适合节省空间和进行低级别类型转换,但需小心数据覆盖。通过`struct`和`union`,程序员能构建更灵活的代码,但也需留意内存对齐和数据管理等问题。
271 2
|
Web App开发 Go PHP
BUUCTF---[极客大挑战 2019]Http1
BUUCTF---[极客大挑战 2019]Http1
|
机器学习/深度学习 存储 算法
【程序员必须掌握的算法】【Matlab智能算法】GRNN神经网络-遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值
【程序员必须掌握的算法】【Matlab智能算法】GRNN神经网络-遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值
|
供应链 流计算
飞鹤基于阿里云实时计算Flink构建数字化运营管理体系
飞鹤借助实时计算Flink等产品,构建数字化运营管理体系,建立实时预警机制,提前窥探风险,为供应链等业务决策提效。
952 0
|
JavaScript
layUI数据表格可编辑扩展日期框
layUI数据表格可编辑扩展日期框
234 0
|
SQL Web App开发 安全
Smanga未授权远程代码执行漏洞(CVE-2023-36076) 附加SQL注入+任意文件读取
Smanga存在未授权远程代码执行漏洞,攻击者可在目标主机执行任意命令,获取服务器权限。
489 0
|
关系型数据库 PostgreSQL Docker
docker 容器部署postgresql数据持久化迁移
docker 容器部署postgresql数据持久化迁移
1190 0