对象的属性类型

JavaScript 中的对象的属性包括数据属性和访问器属性,在 JavaScript 引擎的内部实现中定义了用于描述属性(property)的特性(attribute)。规范中将特性放在了两对方括号中以此表示它们是内部值,在 JavaScript 中不能直接访问这些特性。

数据属性

数据属性的特性包括:

  • [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性;能否修改属性的特性;或能否把属性修改为访问器属性。默认值为 true
  • [[Enumerable]]:表示能否通过 for-in 循环返回属性。默认值为 true
  • [[Writable]]:表示能够修改属性的值。默认值为 true
  • [[Value]]:包含这个属性的数据值。读取属性值的时候从这个位置读,写入属性值的时候把新值保存在这个位置。默认值为 undefined

修改属性的特性

由于属性的特性不能直接访问,因此要修改属性的特性需要使用 Object.defineProperty() 方法。

var person = new Object();
Object.defineProperty(person, 'name', {configurable: false,writable: false,value: 'Nicholas'
});console.log(person.name);       // Nicholas
person.name = 'Greg';
console.log(person.name);       // Nicholas
delete person.name;
console.log(person.name);       // Nicholas

在调用 Object.defineProperty() 方法时,如果不指定, [[Configurable]][[Enumerable]][[Writable]] 特性的默认值都为 false

注:严格模式下,对只读的属性进行赋值操作会导致抛出错误;对不可配置的属性调用 delete 也会导致错误。一旦将属性修改为不可配置后再调用 Object.defineProperty() 方法修改除 [[Writable]] 之外的特性都会导致错误。

访问器属性

访问器属性的特性包括:

  • [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性;能否修改属性的特性;或能否把属性修改为访问器属性。默认值为 true
  • [[Enumerable]]:表示能否通过 for-in 循环返回属性。默认值为 true
  • [[Get]]:在读取属性时调用的函数 getter。默认值为 undefined
  • [[Set]]:在写入属性时调用的函数 setter。默认值为 undefined

访问器属性不能直接定义,必须使用 Object.defineProperty() 来定义。

var book = {_year: 2017,edition: 1
};Object.defineProperty(book, 'year', {get: function () {return this._year;},set: function (newValue) {if (newValue > this.year) {this.edition += newValue - this.year;this._year = newValue;}}
})book.year = 2020;
book.year = 2023;
console.log(book.edition + ', ' + book.year);       // 7, 2023

在读取访问器属性时,会调用 getter 函数,这个函数负责返回有效的值;在写入访问器属性时会调用 setter 函数并传入新值作为参数。

注:不如果只为访问器属性指定 getter 或 setter 函数,意味着该访问器属性是只读或只写的。

同时定义多个属性

使用 Object.defineProperties() 方法可以通过描述符一次定义多个属性。

var book = {};Object.defineProperties(book, {_year: {writable: true,value: 2017},edition: {writable: true,value: 1},year: {get: function () {return this._year;},set: function (newValue) {if (newValue > this.year) {this.edition += newValue - this.year;this._year = newValue;}}}
});book.year = 2020;
book.year = 2023;
console.log(book.edition + ', ' + book.year);       // 7, 2023

转载于:https://www.cnblogs.com/rickkky/p/7496922.html

JavaScript 中对象的属性类型相关推荐

  1. 删除javaScript中对象的属性

    删除javaScript中对象的属性 语法 delete 对象.属性;

  2. 细说JavaScript中对象的属性和方法

    最近在回家的路上读了尼古拉斯的新书<JavaScript面向对象精要>,发现自己对对象的属性和方法不是很熟悉,特别是es5新增的部分,特写此文总结一下,同时也与大家共勉. 本文分为两部分, ...

  3. JS中对象按属性排序(冒泡排序)

    原文地址 https://www.cnblogs.com/it-Ren/p/10898947.html 一路向北√ 越努力,越幸运. JS中对象按属性排序(冒泡排序) 冒泡排序:它重复地走访过要排序的 ...

  4. C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断...

    C#保留2位小数几种场景总结 场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.25. ...

  5. 递归——函数在内部自己调用自己,那么该函数是递归函数 作用和循环效果一样 要加推出条件return,否则发生栈溢出,导致死循环 递归给数组中对象添加属性 toString()和随机数

    递归--函数在内部自己调用自己,那么该函数是递归函数 & 作用和循环效果一样 & 要加推出条件return,否则发生栈溢出,导致死循环 & 递归给数组中对象添加属性 & ...

  6. php中常见的错误类型有,JavaScript中常见的错误类型有哪些?(详细介绍)

    在JavaScript中,当发生错误时会生成描述错误类型的错误对象,此错误对象包含错误类型和编号等信息,这些信息可用于后续处理等,在本篇文章中将给大家介绍常见的错误类型以及如何处理这些错误. Java ...

  7. JavaScript中的六种错误类型

    刚入前端坑,英语又不太好的同学,是不是还在为控制台的错误抓耳挠腮?今天就带大家看一看JavaScript中常见的错误类型. js中的控制台的报错信息主要分为两大类,第一类是语法错误,这一类错误在预解析 ...

  8. JavaScript中对象(Object)的方法

    JavaScript中对象方法总结: 资料来源:网道-互联网开发文档 [https://wangdoc.com/] 1.Object.getPrototypeOf(Object) Object.get ...

  9. javascript中对象_了解JavaScript中的承诺

    javascript中对象 我向您承诺,到本文结束时,您将更好地了解JavaScript. 我与JavaScript有一种"爱与恨"的关系. 但是尽管如此,JavaScript一直 ...

最新文章

  1. Squid处理web数据请求
  2. java sleep方法_百战程序员:java线程的休眠和回复
  3. [jQuery]点击某元素之外触发事件
  4. 我是一名普通程序员,通过自己的努力,我的收入涨了3倍!
  5. Kafka解析之topic创建(3)——合法性验证
  6. 网络分流器|运营商光纤延距解决方案
  7. php 弹窗代码大全,PHP_asp.net弹出窗口代码大全,//关闭,父窗口弹出对话框,子窗 - phpStudy...
  8. java演练 循环嵌套 菱形图案的打印 四个阶段完成输出
  9. python删除数据库_用Python删除Cosmos数据库文档
  10. python的except之后还运行吗_python except异常处理之后不退出,如何解决异常继续执行...
  11. Hive常见的存储格式文件比较
  12. requests session
  13. linux集群中mpi的并行计算环境简单配置,linux集群中MPI的并行计算环境简单配置...
  14. 【无标题】曲线坐标张量分析
  15. InfofoIE浏览器的好助手(转)
  16. 如何拥有类似 hi@hahah.fun 的个人专属域名的邮箱
  17. 一款快速搭建局域网http服务器的神器
  18. 学习笔记:强化学习之A3C代码详解
  19. ORVIBO 精灵款升级分析
  20. 从业多年,谈谈差分输入电路和共模信号,差模信号关系的理解

热门文章

  1. 动态链接库DLL与静态链接库LIB
  2. 哲学家就餐问题--信号量和互斥量预防死锁
  3. 【收藏】Oracle存储过程读写文件
  4. 线程的状态:分离(detached)和joinable(可结合的)
  5. CCF-CSP 201712-2 游戏(C++实现)
  6. MySQL入门系列:存储程序(二)之存储函数简介
  7. ICLR 2019论文接收结果揭晓:24篇oral论文有没有你?
  8. 11g新特性-SQL Plan Management
  9. 一个简单的Spring的AOP例子(JAVA面向切面编程)
  10. MySQL如何利用索引优化ORDER BY排序语句