JavaScript对象的property属性详解

时间:2024-05-05 09:22:57 

JavaScript中对象的property有三个属性:
1.writable。该property是否可写。
2.enumerable。当使用for/in语句时,该property是否会被枚举。
3.configurable。该property的属性是否可以修改,property是否可以删除。

在ECMAScript 3标准中,上面三个属性的值均为true且不可改:新建对象的property是可写的、可被枚举的、可删除的;而在ECMAScript 5标准中,可通过property的描述对象(property descriptor)来对这些属性进行配置和修改。

如果将property的值信息也作为property的属性来看的话,对象中的property拥有四个属性:value、writable、enumerable和configurable。

对于用getter和setter方法来定义的property,由于其没有writable属性(property是否可写取决于setter方法是否存在),因此这种property也有四个属性:get、set、enumerable和configurable — get和set属性的值为function。

获取对象property的属性

ECMAScript 5标准中,可以通过Object.getOwnPropertyDescriptor()来获取对象自身某个property的属性信息:


var o = {x:1};
var a = Object.create(o);
a.y = 3;
console.log(Object.getOwnPropertyDescriptor(a, "y"));//Object {configurable=true, enumerable=true, writable=true, value=3}
console.log(Object.getOwnPropertyDescriptor(a, "x"));//undefined


可以看到,如果property不存在或者property继承自原型对象,则返回undefined。

设置对象property的属性

ECMAScript 5标准中,可以通过Object.defineProperty()来设置对象自身某个property的属性:


Object.defineProperty(a, "y", {
    value:3,
    writable:true,
    enumerable:false,
    configuration:true
});
console.log(a.propertyIsEnumerable("y"));//false


如果设置的property是从原型对象中继承而来的,那么JavaScript将在对象自身中创建一个同名的property,这与赋值操作的相关行为一致:


Object.defineProperty(a, "x", {
    value:1,
    writable:true,
    enumerable:false,
    configuration:true
});
console.log(a.propertyIsEnumerable("x"));//false
console.log(o.propertyIsEnumerable("x"));//true


除了修改property的属性,还可以将property改为用getter或setter访问:


Object.defineProperty(a, "y", {
    get:function(){return 42;}
});
console.log(a.y);//42


在使用Object.defineProperty()时,property描述对象中的属性值可以部分忽略,当属性值有所忽略时,JavaScript中的处理规则如下:

如果property是新建的,则所有忽略的属性值均为false或undefined。
如果property已存在,则所有忽略的属性值维持原样不变。


批量设置对象property的属性

如果需要一次性设置多个property的属性,可以使用Object.defineProperties()语句。该语句将返回修改后的对象。


Object.defineProperties(a, {
    "y":{value:79, writable:true, enumerable:true, configurable:true},
    "z":{value:99, writable:true, enumerable:true, configurable:true}
});
console.log(a);//Object {y=79, z=99}


property属性设置规则

当对property属性进行修改时,必须遵循以下规则。如果违反规则,JavaScript将报TypeError错误:

如果对象不是extensible的,则只能修改已有property的属性,无法添加新的property。
如果property的configurable属性为false,则无法修改configurable和enumerable属性的值,对于writable属性,可以将其从true改为false,但无法将其从false改为true。如果property由getter和setter定义,则getter和setter方法无法被修改。
如果property的configurable属性和writable属性均为false,则property值不可改。如果property的writable属性为false,但其configurable属性为true,则property值依然可以修改。

标签:JavaScript,property
0
投稿

猜你喜欢

  • sqlserver数据库导入数据操作详解(图)

    2024-01-15 09:00:11
  • Python基础教程之异常处理详解

    2022-06-10 07:52:17
  • 使用go module导入本地包的方法教程详解

    2024-03-26 01:44:43
  • 使用Python和Prometheus跟踪天气的使用方法

    2021-05-15 14:31:05
  • FileUpload上传图片预览不变形

    2010-08-05 21:25:00
  • 不要忽略了颜色的可用性

    2009-03-05 18:19:00
  • asp无组件实现画简单图形的类

    2004-06-17 13:30:00
  • python日期相关操作实例小结

    2021-07-14 18:39:13
  • 详解pycharm的python包opencv(cv2)无代码提示问题的解决

    2022-01-10 06:45:34
  • MySQL的慢日志线上问题及优化方案

    2024-01-19 12:15:24
  • Python自动化测试PO模型封装过程详解

    2023-08-23 18:59:49
  • 一个典型的PHP分页实例代码分享

    2023-11-14 23:17:39
  • Python完全新手教程

    2021-08-19 18:38:06
  • 浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)

    2024-05-03 15:53:12
  • 详解Python中的Lock和Rlock

    2023-08-11 18:35:20
  • OpenLayers3实现图层控件功能

    2024-04-17 10:30:46
  • Python使用filetype精确判断文件类型

    2023-07-09 12:30:12
  • tensorflow -gpu安装方法(不用自己装cuda,cdnn)

    2021-01-26 09:06:46
  • asp彩色验证码的制作详解

    2007-09-18 13:22:00
  • django中ORM模型常用的字段的使用方法

    2022-11-02 03:26:15
  • asp之家 网络编程 m.aspxhome.com