js对象的理解
对象的属性
-
我们平常都习惯于通过
let person = { name: "coder", callName() {console.log(this.name)} }的方式来创建一个对象,其中name表示这个对象中的属性,callName表示这个对象中的方法。- 这个对象中的属性会有自己的特征,这些特征会决定属性在js中的行为。
- 属性的特征可以通过内部特性来描述,这些内部特性通常用两个中括号括起来[[]]。
- 这些属性被分为数据属性和访问器属性。
数据属性
* 数据属性包括: * [[Configurable]] * [[Enumerable]] * [[Writable]] * [[Value]] * 等等 * 想要修改属性的默认特性,就必须使用Object.defineProperty()方法,这个方法接收3个参数,它们分别是:对象名、属性名和描述符对象。其中第三个参数描述符对象中的属性就可以包括上面提到的内部特性。 * 在调用Object.Property()时,configurable、enumerable、writable的值如果不指定,默认都为false。如果给configurable设置为false,那么这个属性就不能再将configurable设置为true。访问器属性
* 访问器属性包括: * [[Configurable]] * [[Enumerable]] * [[Get]] * [[Set]] * 访问器属性不包含数据值,它们包含一个获取函数(getter)和一个设置函数(setter),这两个函数不是必须的。在读取访问器属性时会调用获取函数返回一个有效值,在写入访问器属性时会调用设置函数并传入新值,设置函数必须决定对数据做出什么修改。 * 访问器属性不能像数据属性一样直接在对象中定义,访问器属性必须通过Object.defineProperty()来定义。
对象的静态方法
- Object.defineProperties()方法:此方法可以通过多个描述符一次性定义多个属性,它接收两个参数:对象名和描述符对象。
- Object.getOwnPropertyDescriptor()方法:此方法可以取得指定属性的属性描述符,它接收两个参数:对象名和属性名。
- Object.assign()方法:此方法用于对象的浅拷贝,第一个参数是目标对象,其余所有参数都是源对象,这个方法会使用源对象上的[[Get]]取得属性的值,然后使用目标对象上的[[Set]]设置属性的值。
- Object.is()方法:此方法与===很像,接收两个参数,这两个参数用于做对比。