在ECMAscript5属性描述符的详细描述
object.defineproperty
研究属性的描述,首先,我们要谈的object.defineproperty方法。这种方法的功能是定义一个新的属性或修改对象的现有财产。原型如下:
复制代码代码如下所示:
object.defineproperty(obj,支柱,描述符)
使用的例子:
复制代码代码如下所示:
var obj = { };
object.defineproperty(obj,'attr,{价值:1 });
以上的代码段添加一个属性指定属性和价值1的obj对象。量 uff1a
复制代码代码如下所示:
var obj = { };
obj.attr = 1;
相反,对object.defineproperty写作似乎更复杂,但是,其最大的奥秘在于它的第三个参数。
数据描述符
假设我们想要的属性是一个只读属性,我们可以将写入的数据描述符:
复制代码代码如下所示:
var obj = { };
object.defineproperty(obj,'attr,{)
值:1,
写:假
});
console.log(对象属性);
Obj.attr = 2; / / fail
console.log(对象属性);
上面的程序中可以发现两印刷属性的值是1,即写属性失败。然而,这样的结果是有点困惑,因为赋值语句的执行是不正常的,但是失败了。如果我们想在一大块代码中看到这样的问题,就很难发现它。事实上,只要代码在严格的模式下运行,就会出现异常。
复制代码代码如下所示:
严格使用;严格模式下。
var obj = { };
object.defineproperty(obj,'attr,{)
值:1,
写:假
});
obj.attr = 2; / /抛出异常
接下来,看看另一个数据描述符,枚举,可以控制是否可枚举属性。如果只有一个单一的属性是简单的定义,这个属性可以在枚举…在环。
复制代码代码如下所示:
var obj = { };
obj.attr = 1;
对于(var i在obj){ console.log(obj {我});}
枚举可以隐藏它:
var obj = { };
object.defineproperty(obj,'attr,{)
值:1,
枚举:假
});
对于(var i在obj){ console.log(obj {我});}
执行代码的上面部分会发现控制台没有输出因为attr属性不列举在这个时候。
在这里,你可能有一个问题。属性描述符能被修改吗例如,只读属性可以重新定义为可写吗事实上,它依赖于另一个可配置的数据描述符,它可以控制属性描述符是否可以更改。
复制代码代码如下所示:
var obj = { };
object.defineproperty(obj,'attr,{)
值:1,
可写的:false,
配置:真
});
object.defineproperty(obj,'attr,{)
真的写的:
});
obj.attr = 2;
上面的代码部分首先界定了属性为只读属性,然后将其重新定义为可写。因此ATTR写作是成功的。
访问描述符
访问说明符是类似于得到 / set访问器在面向对象。
复制代码代码如下所示:
var obj = { };
object.defineproperty(obj,'attr,{)
设置:功能(Val){这。_attr = math.max(0,瓦迩);},
得到:(){ return这个功能。_attr;}
});
obj.attr = - 1;
console.log(对象属性); / / 0
在上面的代码中,访问属性实际上是一个访问_attr,和最小值限制在0集函数。
获取属性描述符
属性描述符是较早设置的,那么如何得到集合描述符呢object.getownpropertydescriptor可以做这项工作。
复制代码代码如下所示:
var obj = { };
object.defineproperty(obj,'attr,{)
值:1,
可写的:false,
配置:真
});
VaR desc = object.getownpropertydescriptor(obj,'attr);
Console.dir(降序);
对象控制
的object.defineproperty,之前描述的,操作的对象的属性,和下面的三种方法操作对象直接。
object.preventextensions可以使得对象具有新特性:
复制代码代码如下所示:
var obj = { };
obj.attr = 1;
object.preventextensions(obj);
obj.attr2 = 2; / /失败
object.seal可以使对象属性值可以被修改(如果属性是只读的,即使属性值不可修改):
复制代码代码如下所示:
var obj = { };
obj.attr = 1;
Object.seal(obj);
obj.attr = 1.5;
删除obj.attr; / /失败
object.freeze能使物体完全可能修改:
复制代码代码如下所示:
var obj = { };
obj.attr = 1;
Object.freeze(obj);
obj.attr = 1.5; / /失败
obj.attr2 = 2; / /失败
然后你可能会问,你怎么知道某个对象曾经preventextensions,印章,或冻结答案是叫object.isextensible,object.issealed,和Object.isFrozen分别。使用这三个函数既简单又不麻烦。
总的来说,进一步严格控制对象可以通过属性说明符,加强程序的逻辑,唯一的事情是,ES5基本实现的IE9(IE9不支持严格的模式,考虑到国内IE8占有率)是比较高的,这东西是目前唯一用于浏览器和移动终端Node.js。