子曰:学好Object.defineProperty,你也可以写一个Vuejs
大部分内容参考自Microsoft Docs
Vuejs 的实现中用到了Object.defineProperty()
方法,因此在这里系统的了解了一下此方法。
作用
将属性添加到对象,或修改现有属性的特性。
语法
1 | Object.defineProperty(object, propertyname, descriptor) |
参数
object
必需。要在其上添加或修改属性的对象。这款有是一个本地JavaScript 对象(即用户定义的对象或内置对象)或DOM 对象。propertyname
必需。一个包含属性名称的字符串。descriptor
必需。属性描述符。它可以针对数据属性或访问器属性。
返回值
已修改对象
备注
可使用Object.defineProperty
函数来执行以下操作:
- 向对象中添加新属性。
- 修改现有属性的特性。
描述符对象中会提供属性定义,用于描述数据属性或访问器属性的特性。描述符对象是Object.defineProperty
函数的参数。
若要将多个属性添加到对象,或修改现有的多个属性,可以使用Object.defineProperties()
异常
如果以下任意条件为true
,则引发TypeError
异常:
object
参数不是对象- 对象不是可扩展,且不存在指定的属性名称
descriptor
具有value
或writable
特性,并且具有get
或set
特性。descriptor
具有get
或set
特性,上述特性不是函数且已定义。- 指定的属性名称已存在,现有属性具有
false
的configurable
特性,且descriptor
包含一个或多个与现有属性中特性不同的特性。但是,当现有属性具有false
的configurable
特性和true
的writable
特性时,则允许value
或writable
特性不同。
添加数据属性
以下示例中,Object.defineProperty
函数向用户定义的对象添加数据属性。
1 | var newLine = '<br />' |
若要列出对象属性,请将以下代码添加到此示例中。
1 | var names = Object.getOwnPropertyNames(obj) |
修改数据特性
若要修改对象的属性特性,请将以下代码添加到前面所示的addDataProperty
函数。descriptor
参数只包含writable
特性。其他数据属性特性保持不变。
1 | // 修改属性的writable 特性 |
添加访问器属性
在以下示例中,Object.defineProperty
函数向用户定义的对象添加访问器属性。
1 | var newLine = '<br />' |
若要列出对象属性,请将以下代码添加到此示例中。
1 | var names = Object.getOwnPropertyNames(obj) |
修改访问器属性
若要修改对象的访问器属性,请将以下代码添加前面所示的代码。descriptor
参数只包含get
访问器定义。其他属性特性保持不变。
1 | // 修改get 访问器 |
修改DOM 元素上的属性
下面的示例演示如何通过使用Object.getOwnPropertyDescriptor
函数来获取和修改属性的属性描述符,从而自定义内置DOM 属性。对于此示例中,必须通过使用ID 为”div” 的DIV 元素。
1 | // 获取querySelector 属性的descriptor |