总结
- 对象定义为一组属性的无序集合,对象的每个属性或方法都由一个名称来标识,这个名称映射到一个值;可以把 ECMAScript 的对象想象成一张散列表,其中的内容就是一组名/值对,值可以是 数据或者函数。
- 对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符;存取描述符是由 getter 函数和 setter 函数所描述的属性。一个描述符只能是这两者其中之一;不能同时是两者。
- 数据属性(也叫数据描述符),默认情况下,Configurable,Enumerable,Writable为true;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
4.在调用 Object.defineProperty()时,configurable、enumerable 和 writable 的值如果不 指定,则都默认为 false。
- 访问器属性(存取描述符)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
- 读取属性的特性Object.getOwnPropertyDescriptor();Object.getOwnPropertyDescriptors()在每个自有属性上调用 Object.getOwnPropertyDescriptor()并在一个新对象中返回它们。
- 合并对象 Object.assign();这个方法接收一个目标对象和一个 或多个源对象作为参数,然后将每个源对象中可枚举(Object.propertyIsEnumerable()返回 true) 和自有(Object.hasOwnProperty()返回 true)属性复制到目标对象。这个方法会使用源对象上的[[Get]]取得属性的值,然后使用目标 对象上的[[Set]]设置属性的值。如果多个源对象都有相同的属性,则使 用最后一个复制的值。(浅拷贝)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
- Object.is()方法判断两个值是否为同一个值,
- 创建对象:工厂模式,构造函数模式;
工厂模式:可以创建多个类似对象的问题;不足:没有解决对象标识问题(即新创建的对象是什么类型)。
- 构造函数模式,构造函数名的首字母大写;有助于在 ECMAScript 中区分构 造函数和普通函数。
- 构造函数被new后执行如下操作:(1) 在内存中创建一个新对象。 (2) 这个新对象内部的[[Prototype]]特性被赋值为构造函数的 prototype 属性。(3) 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。 (4) 执行构造函数内部的代码(给新对象添加属性)。 (5) 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
- 任何函数只要使用 new 操作符调用就是构造函数,而不使用 new 操 作符调用的函数就是普通函数。
- 构造函数的问题(不足):实例共用的方法会被重新创建;执行Person构造函数会重新创建sayName方法;
- 原型模式解决了构造函数模式的问题(相同逻辑的函数重复创建的问题);优点:定义在原型上的属性和方法会被对象实例共享
- in 操作符会在可 以通过对象访问指定属性时返回 true
- Object.getOwnPropertyNames()想列出所有实例属性,无论是否可以枚举
- 属性枚举顺序:for-in 循环和 Object.keys() 的枚举顺序是不确定的,取决于 JavaScript 引擎,可能因浏览器而异。Object.getOwnPropertyNames()、Object.getOwnPropertySymbols()和 Object.assign() 的枚举顺序是确定性的。先以升序枚举数值键,然后以插入顺序枚举字符串和符号键。在对象字面量中 定义的键以它们逗号分隔的顺序插入。
- 对象迭代:Object.keys(),Object.values()和 Object.entries()
- 原型的不足:弱化了向构造函数传递初始化参数的能力,会导致所有实例默认都取得相同的属性值;主要问题源自它的共 享特性,如果包含引用属性的话,引用属性发生改变,会影响其它的实例对象;(person1.friends发生了改变,影响了person2)
问题
工厂模式,构造函数模式,原型模式解决了哪些问题?
工厂模式:
作用:可以创建多个类似对象的问题;
不足:没有解决对象标识问题(即新创建的对象是什么类型);不知道是哪个构造函数生成的,这个问题可以由构造函数模式来解决;
构造函数模式:
相对于工厂模式创建对象,没有显式地创建对象,属性和方法直接赋值给了 this,没有 return;
不足:实例共用的方法会被重新创建,这个可以由原型模式来解决;
原型模式:
相同逻辑的函数重复创建的问题,优点:定义在原型上的属性和方法会被对象实例共享
不足:弱化了向构造函数传递初始化参数的能力,会导致所有实例默认都取得相同的属性值;如果包含引用属性的话,引用属性发生改变,会影响其它的 实例对象