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
中不能同时设置接见器 (get
和 set
) 和 wriable
或 value
,不然会报以下毛病:
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
要为目的对象增加的属性,个中key
和value
离别代表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