参数vue
Object obj
目标对象框架
String prop
须要定义的属性mvvm
Object descriptor
该属性拥有的特性,可设置的值有:value
属性的值,默认为 undefined
。writable
该属性是否可写,若是设置成 false
,则任何对该属性改写的操做都无效(但不会报错),默认为 false
。spa
get
一旦目标对象访问该属性,就会调用这个方法,并返回结果。默认为 undefined
。code
set
一旦目标对象设置该属性,就会调用这个方法。默认为 undeinfed
。对象
configurable
若是为false,则任未尝试删除目标属性或修改属性如下特性(writable, configurable, enumerable)的行为将被无效化,默认为 false
。blog
enumerable
是否能在for...in循环中遍历出来或在Object.keys中列举出来。默认为 false
。
1. 定义新属性newDataPropertyip
var obj = { height: '180cm', age: 20 }; // 这里的newDataProperty是obj的属性 Object.defineProperty(obj, 'newDataProperty', { // value: 100, // writable: true, enumerable: true, configurable: true, get: function() { return document.getElementById('J_nickName').innerHTML; }, set: function(name) { document.querySelector('#J_nickName').innerHTML = name; } });
2. 参数value、writable、enumerable、configurable的使用(我的感受目前项目中用处不大)get
// value: newDataProperty做为obj的默认属性value为100 var defaultValue = obj.newDataProperty; // writable: 因为设置了writeable为true,因此newDataProperty的属性值仍为100 obj.newDataProperty = 101; // enumerable: 当enumberable的值为false时 newDataProperty没法被枚举 for (var key in obj) { console.log(obj[key]); } // configurable: 修改writable属性 Object.defineProperty(obj, 'newDataProperty', { writable : false }); var descriptor = Object.getOwnPropertyDescriptor(obj, 'newDataProperty'); console.log(descriptor);
3. 关于set和getavalon
通常用于数据和视图联动,mvvm框架的avalon.js、vue.js、angualar.js的双向数据绑定原理就是属性访问器。
不容许同一个属性存在两个及以上的存取访问器配置,因此writable或者value不能与get/set同时配置,不然报错。
// get/set: newDataProperty属性取值 赋值会触发get和set方法 从而形成视图更新 obj.newDataProperty = 'sampson'