资讯专栏INFORMATION COLUMN

JavaScript 中 Object.defineProperty 的使用

mcterry / 2576人阅读

摘要:一旦目标对象访问该属性,就会调用这个方法,并返回结果。如果为,则任何尝试删除目标属性或修改属性以下特性的行为将被无效化,默认为。语法参数目标对象要为目标对象添加的属性,其中和分别代表中的第二和第三个参数。

Object.defineProperty

The Object.defineProperty() method defines a new property directly on an object, or modifies an existing property on an object, and returns the object.

直接在一个对象上定义一个新的属性,或修改一个已经存在的属性。这个方法会返回该对象。

语法

Object.defineProperty(obj, prop, descriptor)

参数

Object obj 目标对象

String prop 需要定义的属性

Object descriptor 该属性拥有的特性,可设置的值有:

value 属性的值,默认为 undefined

writable 该属性是否可写,如果设置成 false,则任何对该属性改写的操作都无效(但不会报错),默认为 false

get 一旦目标对象访问该属性,就会调用这个方法,并返回结果。默认为 undefined

set 一旦目标对象设置该属性,就会调用这个方法。默认为 undeinfed

configurable 如果为false,则任何尝试删除目标属性或修改属性以下特性(writable, configurable, enumerable)的行为将被无效化,默认为 false

enumerable 是否能在for...in循环中遍历出来或在Object.keys中列举出来。默认为 false

注意

descriptor 中不能同时设置访问器 (getset) 和 wriablevalue,否则会报以下错误:

Invalid property.  A property cannot both have accessors and be writable or have a value
实际应用

我们知道,在 Express.js 升级到 4.0 之后,它把很多功能从核心库中移除了。当我们访问那些被移除的属性时,它会报错,告诉我们该属性已经被移除了。这个功能就是通过 Object.defineProperty 来实现的。看看源码吧:

[
  "json",
  "urlencoded",
  "bodyParser",
  "compress",
  "cookieSession",
  "session",
  "logger",
  "cookieParser",
  "favicon",
  "responseTime",
  "errorHandler",
  "timeout",
  "methodOverride",
  "vhost",
  "csrf",
  "directory",
  "limit",
  "multipart",
  "staticCache",
].forEach(function (name) {
  Object.defineProperty(exports, name, {
    get: function () {
      throw new Error("Most middleware (like " + name + ") is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.");
    },
    configurable: true
  });
});
Object.defineProperties

The Object.defineProperties() method defines new or modifies existing properties directly on an object, returning the object.

Object.defineProperty 类似,只不过这个方法可以设置多个属性。

语法

Object.defineProperties(obj, props)

参数

Object obj 目标对象

Object props 要为目标对象添加的属性,其中 keyvalue 分别代表 Object.defineProperty 中的第二和第三个参数。

出处

https://scarletsky.github.io/2015/08/18/Object-learning-in-javascript/

参考资料

http://www.cnblogs.com/rubylouvre/archive/2010/09/19/1831128.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object
https://github.com/strongloop/express/blob/master/lib/express.js

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85889.html

相关文章

  • 详解JavaScript之神奇Object.defineProperty

    摘要:与当与同时为时,属性不能重新使用定义,严格模式下会报错示例云麒报错当或者为时,属性可以重新使用定义,这一点读者不妨自行测试。 摘要: JavaScript有个很神奇的Object.defineProperty(),了解一下? =与Object.defineProperty 为JavaScript对象新增或者修改属性,有两种不同方式:直接使用=赋值或者使用Object.definePro...

    baishancloud 评论0 收藏0
  • JavaScript深入理解对象方法——Object.defineProperty()

    摘要:返回值被传递给函数的对象。描述该方法允许精确添加或修改对象的属性。描述符必须是两种形式之一不能同时是两者。可以是任何有效的值数值,对象,函数等。该方法返回值被用作属性值。该方法将接受唯一参数,并将该参数的新值分配给该属性。 Object.defineProperties() Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性...

    woshicixide 评论0 收藏0
  • JavaScript Object.defineProperty 用法

    摘要:默认为,表示不能被枚举,和中无法枚举该属性,对也有影响。表示对象属性是否可以被删除,以及除和特性外的其它特性能否被修改。宽松模式中,给只读属性赋值不会生效。 在 JavaScript 中,常通过下面方式,添加或修改对象的属性: obj.name = John 除此之外,还能通过 Object.defineProperty() 方法,添加或修改对象的属性。更重要的是,除了目标对象 obj...

    VEIGHTZ 评论0 收藏0
  • 理解JavaScriptObject.defineProperty()函数

    摘要:理解的函数在进入今天的内容之前我们可以先考虑这么一个场景在你的项目中你有这么一个对象如下所示我们的要求就是你要给添加一个属性当的或者发生变化的时候也要随之变化而且当我们设置了的值的时候那么相应的它的和也随之发生变化那么我们应该怎么做呢如果你 理解JavaScript的Object.defineProperty()函数 在进入今天的内容之前,我们可以先考虑这么一个场景,在你的项目中你有这...

    ninefive 评论0 收藏0
  • javascript高级程序设计》笔记:对象数据属性和访问器属性

    摘要:枚举对象的属性第二种情况设置为,可以被枚举。内置对象访问器属性方法介绍摘自方法返回指定对象上一个自有属性对应的属性描述符。对象中存在的属性描述符主要有数据描述符和访问器描述符两种返回传递给函数的对象参考中的 1. 什么是对象 对象是无序属性的集合 创建自定义对象最简单的方式就是以字面量的形式创建对象(或创建一个Object实例),然后再为它添加属性和方法,如下所示: var perso...

    mating 评论0 收藏0

发表评论

0条评论

mcterry

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<