这个方法是es5中新增的方法,以前没了解过,粗略的看了一下也没发现什么特别的用处。而后今天仔细的研究了一下,发现这个方法简直是本身造轮子的必要的方法。框架
先放最简单的代码示例:学习
var John = {}; Object.defineProperty(John,"age",{ value: 23 }) console.log(John.age); //23
我刚开始看到这种例子的时候。。个人心里也是绝望的,这es5新出的都是什么,这干吗不直接John.age = 23不就完事了么。而后我就把页面关掉了。。(不要怪我没耐心,我当时确实没上什么心。。)es5
好了,开始正式介绍这个方法。spa
defineProperty方法总共须要传入三个参数。第一个目标对象,第二个属性名称,第三个是特性descriptor。code
第一第二个不用说,第三个中间又分以下几个值:对象
value: 属性对应的值blog
writable: 若是为false,属性的值不可变ip
configurable 若是为false,该对象的全部desriptor均不可变(包括赋值)字符串
enumerable 是否能在for..in..循环中被遍历出来(感受像是是否public的感受)get
get/set 这两个是重点,也就是我对这个方法推崇,以及认为必需要学习记住的缘由。
下面详细阐述get、set方法:
在descriptor中不能同时设置访问器(get和set)和wriable或value,不然会错,就是说想用get和set,就不能用writable或value中的任何一个。
var John = {} Object.defineProperty(John,"nickName",{ set:function(newValue){ console.log("我新的昵称是"+newValue); }, get:function(){ console.log("有人问了/看了个人昵称"); return "二狗子"; // 这里我随意返回了一个字符串 } }) John.nickName = "哈哈"; // 我新的昵称是哈哈 console.log(John.nickName); // 有人问了/看了个人昵称 // 二狗子
好吧其实东西很少,可是这个方法就是各类框架中的observe的底层实现。即便平时本身使用也很方便。