对象 P205
理解对象
对象
最初通过new Object()到后面对象字面量{x:1},两者创建的结果一致
对象属性特征
通常有一些内部特征描述属性,规范会用中括号括起来,如[[Enumerable]]
分为数据属性,访问器属性
数据属性
[[Configurable]]: 表示属性是否可以delete并且重新定义,是否可以修改它的特性,是否可以更改为访问器属性
[[Enumerable]]:表示迭代器
[[Writable]]:表示他的属性值是否可以修改
[[Value]]:实实在在的值
修改的方式:Object.defineProperty()方法,上述特征不指定的情况下,默认false
访问器属性
[[Configurable]];表示属性是否可以delete并且重新定义,是否可以修改它的特性,是否可以更改为数据属性
[[Enumerable]]:表示迭代器
[[Get]]:获取函数,读取属性的时候会调用,default:undefined
[[Set]]:设置函数,写入属性的时候会调用,default:undefined
访问器属性不能直接定义,必须使用Object.defineProperty()方法
ES5以前采用的是____defineGetter____()和_______defineSetter__()
属性特征的方法
获取特征:Object.getOwnPropertyDescriptor()
多个特征设置:Object.defineProperties()
获取多个特征:Object.getOwnPropertyDescriptors(). ---- es7
合并对象
Object.assign(A, …args),将arg合入A,如果有重复属性取最后一个
⚠️:
- 浅拷贝,内部对象仅拷贝引用
- 是一个尽力而为的过程,假如从B,C,D拷贝到A,在C的时候出错,那结果就是A和B的交集
对象标识及相等判定
Object.is 替代以前的判别方式. Es6
Object.is(true,1); // false
Object.is(-0, 0); // false
Object.is(NaN,NaN); // true
对象解构
事先声明的变量,后面解构需要包含在括号之中
let x,y;
let person = {
x:1,
y:2
};
({x,y} = person);
console.log(x,y)
⚠️:
- 是一个尽力而为的过程,过程中打断不可逆
创建对象
工厂模式
构建函数模式 ---- 不足:当遇到重复属性方法时,不能共用,都是全新的
原型模式
function Person() { }
const x = new Person();
console.log(Person.prototype.constructor === Person) // true
console.log(x.__proto__ === Person.prototype) // true
解析:x为实例,Person为构造函数
Person.prototype.constructor === Person
只要创建函数,就会给这个函数附上一个prototype属性(指向原型)。默认情况下,所有原型对象自动获取一个constructor的属性,指向与之关联的构造函数。
proto
指向构造函数的原型,x有一个特征[[Prototype]]指向Person的原型,也就是Person.prototype,但特征本身不能直接访问,但Firefox,Safari和Chrome在每个对象上暴露了这个属性,指向对象的原型
原型相关的方法:
isPrototypeOf:原型判断
getPrototypeOf: 获取原型
setPrototypeOf:设置原型,⚠️:不建议使用,可能会影响性能
替代方案==> let person = Object.create(bip);
hasOwnPrototype:判断属性是否来自实例
In操作符
console.log("name" in Person)
无论name在实例还是原型,只要存在就是true,因而判断一个属性是在原型上还需要hasOwnPrototype辅助判断
function hasPrototypeProperty(obj, name) {
return !obj.hasPrototypeProperty(name) && (name in obj)
}
获取实例属性
Object.keys : 获取可枚举实例属性
Object.getOwnPropertyNames:获取所有实例属性
Object.getOwnPropertySymbols:获取特殊的符号类型的属性。---- Symbol
一些其他语法和原型继承暂时未整理
类
实现继承过于麻烦,ES6定义了class
定义
类不会声明提升
类构造函数
实例化
new:
- 内存创建一个新对象
- 对象内部[[Prototype]]指向构造函数的prototype属性
- this指向新对象
- 执行构造函数
- 返回构造函数结果/该对象