理解对象
面向对象的定义:无序属性的集合,其属性可以包含基本值、对象或者函数。每个对象都是基于一个引用类型创建的。
属性类型
ECMAScript中有两种属性:数据属性
和访问器属性
为了表示特性是内部值,ECMA-262规范把属性放在了两对儿方括号中,如[[Enumerable]]
数据属性
描 述 | 默认值 |
---|---|
访问器属性不包含数据值,它们包含一对儿getter
和setter
函数(非必须)
读取访问器属性时,会调用getter
函数;写入访问器属性时,会调用setter
属性并传入新值
描 述 | 默认值 |
---|---|
Object.defineProperty()
数据属性和访问器属性可以通过Object.defineProperty进行设置。要修改属性默认的特性,必须使用这个方法,常用于DOM对象
console.log(person.name) // Niko
delete person.name
console.log(person.name) // Niko
person.name = 'Bellic'
console.log(person.name) //Bellic</code></pre>
2014){
this.edition += newValue-this._year
this._year = newValue
}
}
})
book.year = 2015
console.log(book.edition) // 2</code></pre>
Object.defineProperties()
定义多个属性
Object.getOwnPropertyDescriptor()
返回指定指定属性的描述对象
方法。以上面的person为例来使用
var descriptor=Object.getOwnPropertyDescriptor(person,”name”);
console.log(descriptor.Value);
console.log(descriptor.Writable);
Object.getOwnPropertyDescriptors()
es6引入,返回对象所有属性(非继承属性)的描述对象
主要是为了解决object.assign()
无法正确拷贝get
属性和set
属性²
...
ES6拓展
属性的遍历
-
for..in
循环遍历对象自身和继承的可枚举属性(不包含Symbol属性)
-
Object.keys
(obj)
返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不包含Symbol属性)的键名
-
OBject.getOwnPropertyNames
(obj)
返回一个数组,包含对象的所有属性(包括不可枚举属性)(不包含Symbol属性)的键名
-
Object.getOwnPropertySymbols
(obj)
返回一个数组,包含对象自身的所有Symbol属性的键名
-
Reflect.ownKeys
(obj)
返回一个数组,包括对象自身的所有键名(包括不可枚举属性和Symbol属性或字符串)
object.assign()
Object.assign(target,source1,source2)
对象的合并,将源对象(source)可枚举的属性,复制到目标对象(target)并返回被修改的目标对象
注意点:
- 浅拷贝
拷贝的是源对象的引用,源对象有任何变化,都会反应到目标对象上
- 同名属性的替换
目标对象和源对象的属性名相同时,源对象会替换掉目标对象的该属性
- 数组的处理
Object.assign([1,2,3],[4,5]) // 返回[4,5,3] 数组被视为对象{1:1,2:2,3:3},{1:4,2:5}
使用技巧
-
-
-
克隆对象
属性
function clone(origin){
return Object({},origin)
}
// 克隆对象的继承值
function clone2(origin){
let originProto = Obeject.getPrototypeOf(origin)
return Object.assign(Object.create(originProto),origin);
}
对原型对象的操作方法
-
__proto__
用来读取或设置当前对象的prototype对象。(ps:以下划线命令的一般都是只读私有属性,所以原型对象的操作最好用下面 原文链接:https://www.f2er.com/js/414102.html