/*这段时间面试,被问到一些对象原理就答不上来,感觉自己对于一些知识点的理解不够系统,在这里对一些知识点做统一的整理,有不对的地方也欢迎大家提出来(#.#)
文章中有借鉴其他文章中的内容,若有侵权,联系必删 q:1097925740 */
什么是对象?
ECMA-262(ECMAScript5.1的规范)规定:对象是一组属性的无需集合,每个属性和方法都有一个名称来标识,这个名称映射到这个值。
对象属性
对象中的属性决定了对象的特征,对象特征决定了对象在js中的行为。
ECMA-262使用了一些内部特性来描述属性特征。开发者不能在js中直接访问这些属性。
内部特性表示:[[enumerable]]
属性分为两种:数据属性、访问器属性。
数据属性
数据属性包含一个保存数据值的位置([[value]]),值会从这个位置被读取、也会被写入到这个位置。
数据属性的四个特性:
- [[configurable]] 表示属性是否可以被删除、重新定义、修改特性、改为访问器属性,直接定义在对象上的属性默认true;一个属性[[configurable]]特性被设置为false后,不可再修改为true。
- [[enumerable]] 是否可以被for…in遍历,直接定义在对象上的属性默认true;
- [[writable]] 属性值是否可以被修改,直接定义在对象上的属性默认true;
- [[value]] 指属性的实际值,前面提到的读入和写入的位置,默认undefined
修改属性的默认特性: object.defineProperty;
实现:object.defineProperty(对象,对象属性名,{ 描述符对象})
访问器属性
访问器属性不包含数据值,包含一个获取函数(getter)和设置函数(setter)
访问属性的四个特性:
- [[configurable]] 是否能够删除并重新定义,修改特性,修改它为数据属性;直接定义在对象上的属性默认true;
- [[enumerable]] 是否可以遍历,直接定义在对象上的属性默认true;
- ** [[get]] ** 用于获取函数,在读取函数时调用,默认为undefined
- ** [[set]] ** 设置函数,写入函数时调用,默认值为undefined
访问器属性的定义: object.defineProperty;
实现:object.defineProperty(对象,对象属性名,{ 描述符对象})
通过object.defineProperty定义私有成员(一般加_的表示私有)和公共成员。
拓展:私有成员的定义。
object.property(book,'year',{
get(){
return this.year_; //此处通过访问year去return year_,让用户真正访问的不是真实year_,避免用户修改year_,使year_私有。
},
set(value){
this.year_ = value; //设置year_值。
}
})
定义多个属性
object.properties()方法可以实现一次性定义多个属性。
object.properties(对象,{描述符对象}),其属性要与添加修改的属性意义对应。
通过object.defineProperty定义的属性特性值默认为false;
读取属性特性
Object.getPropertyDescriptor(对象,对象属性名).[[特性]]
合并对象
把源对象属性复制到目标对象上。
object.assign(目标对象,源对象)将源对象的可遍历属性通过get\ser方法复制到目标对象上,最后返回修改后的目标对象。
object.assign是一个浅复制:
- 如果多个源对象有相同的属性,最后一个对象的属性会覆盖前面的属性。
- 不能在两个对象中转移函数和设置函数。
- 属性为对象时,复制的是对象的引用。<