Object.defineProperties()
方法直接在一個對象上定義新的屬性或修改現有屬性,並返回該對象。ide
Object.defineProperties(obj, props)
函數
true
當且僅當該屬性描述符的類型能夠被改變而且該屬性能夠從對應對象中刪除。默認爲 false
true
當且僅當在枚舉相應對象上的屬性時該屬性顯現。默認爲 false
undefined
.false
undefined
undefined
傳遞給函數的對象。prototype
Object.defineProperties
本質上定義了obj 對象上props的可枚舉屬性相對應的全部屬性。code
var obj = {}; Object.defineProperties(obj, { 'property1': { value: true, writable: true }, 'property2': { value: 'Hello', writable: false } // etc. etc. });
假設一個原始的執行環境,全部的名稱和屬性都引用它們的初始值,Object.defineProperties幾乎徹底等同於(注意isCallable中的註釋)如下JavaScript中的從新實現:對象
function defineProperties(obj, properties) { function convertToDescriptor(desc) { function hasProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } function isCallable(v) { // NB: modify as necessary if other values than functions are callable. return typeof v === 'function'; } if (typeof desc !== 'object' || desc === null) throw new TypeError('bad desc'); var d = {}; if (hasProperty(desc, 'enumerable')) d.enumerable = !!desc.enumerable; if (hasProperty(desc, 'configurable')) d.configurable = !!desc.configurable; if (hasProperty(desc, 'value')) d.value = desc.value; if (hasProperty(desc, 'writable')) d.writable = !!desc.writable; if (hasProperty(desc, 'get')) { var g = desc.get; if (!isCallable(g) && typeof g !== 'undefined') throw new TypeError('bad get'); d.get = g; } if (hasProperty(desc, 'set')) { var s = desc.set; if (!isCallable(s) && typeof s !== 'undefined') throw new TypeError('bad set'); d.set = s; } if (('get' in d || 'set' in d) && ('value' in d || 'writable' in d)) throw new TypeError('identity-confused descriptor'); return d; } if (typeof obj !== 'object' || obj === null) throw new TypeError('bad obj'); properties = Object(properties); var keys = Object.keys(properties); var descs = []; for (var i = 0; i < keys.length; i++) descs.push([keys[i], convertToDescriptor(properties[keys[i]])]); for (var i = 0; i < descs.length; i++) Object.defineProperty(obj, descs[i][0], descs[i][1]); return obj; }