Javascript中对象的属性我们已经非常熟悉了,但是对象属性的特性你了解吗?我想多半用过js的人都不太了解,其根本原因是我们平时基本不会用到,除非是写过一些框架和库的,那么今天之所以要提到它是因为目前一些主流的mvvm框架的核心:数据驱动,响应式数据是跟它有关的,想搞懂mvvm框架,对它还是有必要了解一下的。
与其相关的方法有四个
- Object.defineProperty(obj,prop,descriptor)
- Object.defineProperties(obj,props)
- Object.getOwnPropertyDescriptor(obj,prop)
- Object.getOwnPropertyDescriptors(obj)
前面两个是用来定义属性特性的,后面两个与之相对,用来获取属性的相关特性,下面我们具体来看一下怎么使用。
数据属性
定义的对象属性,默认情况下有4个特性,只是我们看不到而已
- Value: 属性对应的值,默认情况下是undefined
- Writable: 是否可以修改属性的值,默认为true
- Enumerable:是否可以被枚举,能被for-in循环或者Ojbect.keys()返回属性,默认为true
- Configurable: 是否可配置,包括能否通过delete删除属性,能否修改属性的特性,能否把属性修改为访问器属性,默认为true
但是通过getOwnPropertyDescriptor方法可以查看(getOwnPropertyDescriptors获取对象所有属性特性)
var obj = { a: 1, b: 2, c: 3 } console.log('a属性特性:', Object.getOwnPropertyDescriptor(obj, 'a'))
接下来我们就可以根据业务需求来修改属性的特性了
访问器属性
访问器属性才是响应式数据的核心,我们通过设置访问器属性就可以对属性进行监听,其也有4个特性,主要是get和set方法
- Configurable: 是否可配置,包括能否通过delete删除属性,能否修改属性的特性,能否把属性修改为访问器属性,默认为true
- Enumerable:是否可以被枚举,能被for-in循环或者Ojbect.keys()返回属性,默认为true
- Get: 给属性提供一个gettr方法,当属性被访问时会调用该方法,如果没有 getter 则为 undefined
- Set: 给属性提供一个gettr方法,当重新给属性赋值时会调用该方法,如果没有 setter 则为 undefined
以上就是基本的用法了,写的不全,我觉得主要是理解和认识有这样的功能吧。