JavaScript 中 Object.defineProperty 的运用

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

    原文作者:scarlex
    原文地址: https://segmentfault.com/a/1190000003109392
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞