返回顶部
首页 > 资讯 > 前端开发 > node.js >JS属性的特性是什么
  • 870
分享到

JS属性的特性是什么

2024-04-02 19:04:59 870人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关js属性的特性是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概念ECMAScript 5 中定义了一个名叫“属性描述符”的

这篇文章将为大家详细讲解有关js属性的特性是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

概念

ECMAScript 5 中定义了一个名叫“属性描述符”的对象,用于描述了的各种特征。属性描述符对象有4个属性:

  • configurable:可配置性,控制着其描述的属性的修改,表示能否修改属性的特性,能否把属性修改为访问器属性,或者能否通过delete删除属性从而重新定义属性。默认值为true。

  • enumerable:可枚举性,表示能否通过for-in遍历得到属性。默认值为true。

  • writable:可写性,表示能否修改属性的值。默认值为true。

  • value:数据属性,表示属性的值。默认值为undefined。

除了上面的属性,还有两个存取器属性,分别是get和set,可以代替value和writable。

  • get:在读取属性时调用的函数。只指定get则表示属性为只读属性。默认值为undefined。

  • set:在写入属性时调用的函数。只指定set则表示属性为只写属性。默认值为undefined。

使用

“属性描述符”对象只能在Object.defineProperty或Object.defineProperties中使用。

api 用法

Object.defineProperty:https://developer.mozilla.org...

Object.defineProperties: Https://developer.mozilla.org...

var hello = {}  Object.defineProperty(hello, 'girl', {     configurable: false,     enumberable: false,     writable: true,     value: 'sexy' })  // 存取器 Object.defineProperty(hello, 'woman', {     configurable: false,     enumberable: false,     get: function() {         return this.girl     },     set: function(val) {         this.girl = val     } })  // 定义多个属性 Object.defineProperties(hello, {     boy: {         configurable: false,         enumberable: false,         writable: false,         value: 'handsome'     },     man: {         configurable: false,         enumberable: false,         writable: true,         get: function() {             return this.boy         }     } })

当用Object.defineProperty或Object.defineProperties操作(新建或者修改)那些不允许创建或修改的属性时,会抛出类型错误异常。

// 此例子运行在前面的例子的基础上 Object.defineProperty(hello, 'boy', {     writable: true })    // Uncaught TypeError: Cannot redefine property: boy

因为前面boy属性已经被设置为不可配置,所以这里修改writable会抛出类型错误异常。

通过Object.getOwnPropertyDescriptor或者Object.getOwnPropertyDescriptors可以得到属性描述符。

API 用法

Object.getOwnPropertyDscriptor:https://developer.mozilla.org...

Object.getOwnPropertyDescriptors:https://developer.mozilla.org...

规则

var rules = {     common: 'test' }

如果属性是不可配置的,则不能修改它的可配置性和可枚举性。

Object.defineProperty(rules, 'rule1', {     configurable: false,     enumberable: false })  // 修改configurable会抛出类型错误异常 Object.defineProperty(rules, 'rule1', {     configurable: true })    // Uncaught TypeError: Cannot redefine property: rule1  // 修改enumberable不会抛出异常,但enmuberable没有被修改 Object.defineProperty(rules, 'rule1', {     enumberable: true }) Object.getOwnPropertyDescriptor(rules, 'rule1')    // Object {value: undefined, writable: false, enumerable: false, configurable: false}

如果存取器属性是不可配置的,则不能修改get和set方法,也不能将它转换为数据属性。

Object.defineProperty(rules, 'rule2', {     configurable: false,     enumberable: false,     get: function() {         return this.common     },     set: function(val) {         this.common = val     } })  // 修改get或者set方法会抛出类型错误异常 Object.defineProperty(rules, 'rule2', {     get: function() {         return this.common + 'rule2'     } })    // Uncaught TypeError: Cannot redefine property: rule2  Object.defineProperty(rules, 'rule2', {     set: function(val) {         this.common = 'rule2'     } })    // Uncaught TypeError: Cannot redefine property: rule2  // 将它转换为数据属性同样会抛出类型错误异常 Object.defineProperty(rules, 'rule2', {     value: 'rule2' })    // Uncaught TypeError: Cannot redefine property: rule2

如果数据属性是不可配置的,则不能将它转换为存取器属性;同时,也不能将它的可写性从false修改为true,但可以从true修改为false。

Object.defineProperty(rules, 'rule3', {     configurable: false,     writable: false,     value: 'rule3' })  // 修改writable为true会抛出类型错误异常 Object.defineProperty(rules, 'rule3', {     writable: true })   Object.defineProperty(rules, 'rule4', {     configurable: false,     writable: true,     value: 'rule4' })  // 可以修改writable为false Object.defineProperty(rules, 'rule4', {     writable: false }) Object.getOwnPropertyDescriptor(rules, 'rule4')    //   Object {value: "rule4", writable: false, enumerable: false, configurable: false}

如果数据属性是不可配置且不可写的,则不能修改他的值;如果是可配置但不可写,则可以修改他的值(实际上是先将它标记为可写的,然后修改它的值,***再将它标记回不可写)。

其实这里所说的修改值,是通过Object.defineProperty或Object.defineProperties方法修改。通过直接赋值的方法在数据属性不可配置的情况下是不能修改属性值的。

Object.defineProperty(rules, 'rule5', {     configurable: false,     writable: false,     value: 'rule5' })  // 修改属性值会抛出类型错误异常 Object.defineProperty(rules, 'rule5', {     value: 'rule55' })    // Uncaught TypeError: Cannot redefine property: rule5  rules.rule5 = 'rule55' // 值没有被修改,也不会抛出异常 rules.rule5            // 'rule5'   Object.defineProperty(rules, 'rule6', {     configurable: true,     writable: false,     value: 'rule6' })  // 修改属性值 Object.defineProperty(rules, 'rule6', {     value: 'rule66' }) rules.rule6            // 'rule66'  rules.rule6 = 'rule6' // 值没有被修改,也不会修改 rules.rule6            // 'rule6'

只指定set不能读,如果尝试读取该属性值,返回undefined。(红宝书上说在严格模式下才抛出异常,但没有)

Object.defineProperty(rules, 'rule7', {     get: function() {         return this.common     } }) rules.rule7 = 'rule7'    // Uncaught TypeError: Cannot redefine property: rule7

如果对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新属性。

操作对象可扩展性的API有三个:Object.preventExtensions、Object.seal、Object.freeze。

API 用法

Object.preventExtensions:https://developer.mozilla.org...

Object.seal:https://developer.mozilla.org...

Object.freeze:https://developer.mozilla.org...

Object.isExtensions:https://developer.mozilla.org...

Object.isSealed:https://developer.mozilla.org...

Object.isFrozen:https://developer.mozilla.org...

使用Object.preventExtensions可以将对象转换为不可扩展。

使用Object.isExtensions来判断对象是否可扩展。

var ex = {} Object.defineProperty(ex, 'ex1', {     configurable: true,     writable: true,     value: 'ex1' }) Object.isExtensible(ex)        // true Object.preventExtensions(ex) Object.isExtensible(ex)        // false  // 可以修改已有的属性 Object.defineProperty(ex, 'ex1', {     writable: false,     value: 'ex11' }) Object.getOwnPropertyDescriptor(ex, 'ex1')    // Object {value: "ex11", writable: false, enumerable: false, configurable: true}  // 添加属性会抛出类型错误异常 Object.defineProperty(ex, 'ex2', {     value: 'ex2' })    // Uncaught TypeError: Cannot define property:ex2, object is not extensible.

使用Object.seal除了可以将对象转换为不可扩展的,还可以将对象的所有自有属性都转换为不可配置的。即不能给对象添加新属性,而且它已有的属性也不能删除或者配置(这里同样会遵循前面的规则)。

使用Object.isSealed来判断对象是否封闭(sealed)。

var se = {} Object.defineProperty(se, 'se1', {     configurable: true,     writable: false,     value: 'se1' }) Object.isSealed(se)        // false Object.seal(se) Object.isSealed(se)        // true  // 修改已有的属性会抛出类型错误异常 Object.defineProperty(se, 'se1', {     writable: true,     value: 'se11' })    // Uncaught TypeError: Cannot redefine property: se1  // 添加属性会抛出类型错误异常 Object.defineProperty(se, 'se2', {     value: 'se2' })    // Uncaught TypeError: Cannot define property:se2, object is not extensible.

使用Object.freeze除了将对象转换为不可扩展的和将其属性转换为不可配置的之外,还可以将自有属性转换为只读。(如果对象设置了set,存取器属性将不会受影响,仍可以调用set方法,而且不会抛出异常,但如果set方法是改变该对象的属性,则不能修改成功)

使用Object.isFrozen来检测对象是否冻结(frozen)。

var fr = {} Object.defineProperty(fr, 'fr1', {     configurable: true,     writable: false,     value: 'fr1' }) Object.isFrozen(fr)        // false Object.freeze(fr) Object.isFrozen(fr)        // true  // 修改已有的属性会抛出类型错误异常 Object.defineProperty(fr, 'fr1', {     writable: true,     value: 'fr11' })    // Uncaught TypeError: Cannot redefine property: fr1  // 添加属性会抛出类型错误异常 Object.defineProperty(fr, 'fr2', {     value: 'fr2' })    // Uncaught TypeError: Cannot define property:fr2, object is not extensible.  fr.fr1 = 'fr11' // 不能修fr1属性 fr.fr1            // 'fr1' var set = {} Object.defineProperty(set, 'set1', {     configurable: true,     value: 'set1' }) Object.defineProperty(set, 'set2', {     configurable: true,     set: function(val) {         this.set1 = val     } }) Object.isFrozen(set)        // false Object.freeze(set) Object.isFrozen(set)        // true  set.set2 = 'set2' set.set1                    // 'set1'

我对属性描述符很不熟悉,主要是因为平时用得少。不过最近,开始学写一些小的库(虽然很挫),就感觉属性描述符有使用的场景了。我暂时能想到的就是将库对象的一些属性设置为只读,以防止对象的一些属性被用户重写覆盖了。还有一个用法是在知乎和学Vue的时候知道的,就是通过getter和setter实现“监听”对象属性的数据更新(在这里挖一个坑。后面学习一下这种方法,再写一篇“监听”对象属性的数据更新的文章)。

关于JS属性的特性是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: JS属性的特性是什么

本文链接: https://lsjlt.com/news/86133.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JS属性的特性是什么
    这篇文章将为大家详细讲解有关JS属性的特性是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概念ECMAScript 5 中定义了一个名叫“属性描述符”的...
    99+
    2024-04-02
  • JS的特性是什么
    这篇文章主要介绍“JS的特性是什么”,在日常操作中,相信很多人在JS的特性是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS的特性是什么”的疑惑有所帮助!接下来,请跟着...
    99+
    2024-04-02
  • js中offsettop属性的作用是什么
    offsetTop属性返回的是一个元素相对于其offsetParent元素的顶部偏移量(即元素顶部边缘与offsetParent元素...
    99+
    2023-10-24
    js
  • js中switch语句的特性是什么
    这篇文章主要介绍“js中switch语句的特性是什么”,在日常操作中,相信很多人在js中switch语句的特性是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js中switch语句的特性是什么”的疑惑有所...
    99+
    2023-06-20
  • CSS3的相关属性特点是什么
    这篇文章主要为大家展示了“CSS3的相关属性特点是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS3的相关属性特点是什么”这篇文章吧。概述 transi...
    99+
    2024-04-02
  • css中background属性的特点是什么
    小编给大家分享一下css中background属性的特点是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!   简写顺序:color-image-repeat-attachment-p...
    99+
    2024-04-02
  • javascript对象属性的特征是什么
    本篇内容介绍了“javascript对象属性的特征是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对象特征:1、writable:可写w...
    99+
    2023-06-25
  • position属性值及其特点是什么
    这篇文章将为大家详细讲解有关position属性值及其特点是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。   position属性   position属性就是...
    99+
    2024-04-02
  • HTML中display属性的属性值是什么
    这篇文章主要为大家展示了“HTML中display属性的属性值是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HTML中display属性的属性值是什么”这...
    99+
    2024-04-02
  • js中screenX事件属性的作用是什么
    在JavaScript中,`screenX`事件属性用于获取鼠标事件相对于屏幕(显示器)的水平位置。它表示鼠标事件发生时光标相对于整...
    99+
    2023-10-12
    js
  • js中cancelable事件属性的作用是什么
    cancelable事件属性是一个布尔值,用于确定事件是否可以被取消。当cancelable属性值为true时,表示事件可以被取消;...
    99+
    2023-10-12
    js
  • margin-top属性的语法和特征是什么
    本篇文章为大家展示了margin-top属性的语法和特征是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。你对margin-top 属性的语法和特征是否了解,这里...
    99+
    2024-04-02
  • CSS中display属性参数的特点是什么
    本篇内容介绍了“CSS中display属性参数的特点是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C...
    99+
    2024-04-02
  • js的Style background属性有什么用
    在JavaScript中,Style background属性用于设置或获取元素的背景样式。它可以用于改变元素的背景颜色、背景图片、...
    99+
    2023-09-18
    js
  • css属性中float属性的作用是什么
    本教程操作环境:Windows10系统、CSS3版、DELL G3电脑css属性中float属性的作用是什么?float,css的一种属性,主要属性值为:left(左浮动)、none(不浮动)、right(右浮动)、inherit(继承父元...
    99+
    2023-05-14
    float css
  • css中border边框属性特点是什么
    小编给大家分享一下css中border边框属性特点是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   简写顺序:widt...
    99+
    2024-04-02
  • JavaScript的属性是什么
    本篇内容介绍了“JavaScript的属性是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • ajax的属性是什么
    这篇文章主要介绍ajax的属性是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! ajax的属性有:url、type、timeout、async、bef...
    99+
    2024-04-02
  • MySQL的特性是什么
    这篇文章主要介绍MySQL的特性是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗...
    99+
    2024-04-02
  • node.js的特性是什么
    本文小编为大家详细介绍“node.js的特性是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“node.js的特性是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作