在ECMAscript5属性描述符的详细描述

在ECMAscript5属性描述符的详细描述
属性说明符是ES5的新概念,它是用来对对象的属性中添加更多的控制。

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。

tag:属性描述描述符详细电脑软件

相关内容