Object.defineProperty方法
2017-08-22 16:36
567 查看
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>defineProperty</title> </head> <body> <script> /* ECMA中有两种属性:数据属性和访问器属性 数据属性有4个描述其行为的特性: configurable:表示能否通过delete删除,能否修改属性特性或者能否把属性修改为访问器属性 enumerable:表示能否通过for-in循环返回属性 writable:表示能否修改属性的值 value:读取属性的时候从这个位置读,写入属性的时候把新值保存在这个位置。这个属性的默认值为undefined 要修改属性默认的特性,必须使用ECMAScript5中的Object.defineProperty(obj, prop, descriptor)方法 Object.defineProperty有三个参数:属性所在的对象,属性的名字,描述符对象 */ var person={}; Object.defineProperty(person,'name',{ writeble:false, value:'leo' }); alert(person.name); person.name='miaov'; alert(person.name); /* 上面的例子在person对象中创建了一个名name的属性,它的值"leo"是只读的。这个属性的值是不可修改的,如果尝试为它指定新值,在非严格模式下赋值操作将被忽略;在严格模式下,赋值操作导致错误。 特别要注意的是一旦configurable设置为false,属性就会被定义为不可配置的,就不能把它变回可配置的了,此时,再调用Object.defineProperty()方法除了修改writable之外的特性在严格模式下都会导致错误,在非严格模式下会被忽略 */ //////////////////////////////////////////////////////////////////////////////////////////////////// /* 访问器属性不包含数据值,它们包含一对getter和setter函数,在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性的时候,会调用setter函数并传入新的值,这个函数负责处理数据。 访问器属性也有4个描述其行为的特性: configurable:表示能否通过delete删除,能否修改属性特性或者能否把属性修改为访问器属性 enumerable:表示能否通过for-in循环返回属性 get:读取属性时调用的函数,默认值为undefined set:在写入属性时调用的函数,默认为undefined */ var book={ _year:2004, edition:1 } Object.defineProperty(book,"year",{ get:function (){ return this._year; }, set:function (newValue){ if (newValue>2004) { this._year=newValue; this.edition+=newValue-2004; } } }) book.year=2005; alert(book.edition);//2 /* 以上代码创建了一个book对象,并给它定义两个默认属性:_year和edition。_year前面的下划线是一种常用记号 ,表示该属性只能通过.的方式访问。而访问器属性year则包含一个getter函数和setter函数。getter函数返回_year的值,setter函数通过计算来确定正确的版本。因此,把year属性修改为2005会导致_year变成2005,而edition变为2。这是访问器属性常见的方式,即设置一个属性值会导致其他属性发生变化。这也正是vue.js实现数据双向绑定的原理。 在defineProperty()方法之前,要创建访问器属性,一般要使用两个非标准的方法 __defineGetter__() __defineSetter__() var book={ _year:2004, edition:1 } book.__defineGetter__("year",function (){ return this._year; }); book.__defineSetter__("year",function (newValue){ if (newValue>2004) { this._year=newValue; this.edition+=newValue-2004; } }); book.year=2005; alert(book.edition); */ </script> </body> </html>
相关文章推荐
- JS中的双向数据绑定及Object.defineProperty方法
- includes方法 使用 Object.defineProperty 扩展 ,解决不兼容问题
- JavaScript Object.defineProperty()方法详解
- 22、ECMA5给原型对象重新设置构造器的方法Object.defineProperty(p1,p2,p3)
- Object.defineProperty()定义对象方法
- 面试题:(考察Object.defineProperty(obj,prop,descriptor) 的get方法)
- Object.defineProperty方法
- JS中的双向数据绑定及Object.defineProperty方法
- ECMA5中的Object.defineProperty()方法
- JavaScript使用Object.defineProperty方法实现双数据绑定
- js中的Object.defineProperty方法
- js中神奇的Object.defineProperty方法
- javascript中的Object.defineProperty()与getOwnPropertyNames ()方法
- Object.defineProperty()的set方法除了用于双向绑定还能干嘛?
- JavaScript Object.defineProperty()方法详解
- ECMAScript5 Object的新属性方法(包含Object.create()、Object.defineProperty()等)
- vue 数据绑定实现的核心 Object.defineProperty()
- 使用Object.defineProperty重新定义属性时需要注意的一点
- JavaScript中对Object.defineProperty 函数 的理解
- vue 数据绑定实现的核心 Object.defineProperty()