接下來逐步介紹概念.vue
指把一個庫引入一箇舊的瀏覽器, 而後用舊的API, 實現一些新的API的功能.segmentfault
Object.definePropety(obj, prop, descriptor)
當修改或定義對象的時候, 給屬性添加一些特性瀏覽器
var obj = { test: 'hello' } // 對象已有的屬相添加特性描述 Object.defineProperty(obj, 'test', { configurable: true | false, enumerable: true | false, value: `任意類型的值`, writable: true | false }) // 對象新添加的屬性描述 Object.defineProperty(obj, 'newKey', { configurable: true | false, enumerable: true | false, value: `任意類型的值`, writable: true | false })
- 屬性對應的值, 能夠爲任意類型的值.
- 默認:
undefined
// 不設置value的值 Object.defineProperty(obj, 'newKey', { }) console.log(obj.newKey) // undefined /* 注: 兩段代碼不能同時出現 ; 報錯: Cannot redefine property: newKey 緣由: configurable屬性默認爲false, 不能修改; writable默認fasle, 不能被重寫 */ // 設置value值 Object.defineProperty(obj, 'newKey', { value: 'this is test' }) console.log(obj.newKey) // undefined
- 屬性的是否能夠被重寫.
- 默認false, 不能被重寫.
// writable爲false, 不可被重寫 Object.defineProperty(obj, 'newKey', { value: 'hello', writable: false }) Object.defineProperty(obj, 'newKey', { value: 'change' }) // 這種狀況下會報錯: Cannot redefine property: newKey console.log(obj.newKey)
// 能夠被重寫 Object.defineProperty(obj, 'newKey', { value: 'hello', writable: false }) obj.newKey = 'change' console.log(obj.newKey) // hello
- 此屬性是否能夠枚舉(使用for...in或者Object.keys)
- 默認爲false: 不可枚舉
// 不可枚舉 var obj = {} Object.defineProperty(obj, 'newKey', { value: 'hello' }) console.dir(obj) // {}
// 能夠枚舉 var obj = {} Object.defineProperty(obj, 'newKey', { value: 'hello', enumerable: true }) console.dir(obj) // { newKey: 'hello' }
- 目標屬性是否能夠被刪除
- 目標屬性的特性是否能夠被再次修改
- 默認false, 不可刪除與修改
// 屬性不可被刪除 var obj = {} Object.defineProperty(obj, 'newKey', { value: 'hello', configurable: false }) delete obj.newKey console.log(obj.newKey) // hello
// 屬性能夠被刪除 var obj = {} Object.defineProperty(obj, 'newKey', { value: 'hello', configurable: true }) delete obj.newKey console.log(obj.newKey) // undefined
// 不能修改特性 var obj = {} Object.defineProperty(obj, 'newKey', { value: 'hello', writable: false, configurable: false }) Object.defineProperty(obj, 'newKey', { writable: true, }) // 報錯: Cannot redefine property: newKey
// 再次修改特性 var obj = {} Object.defineProperty(obj, 'newKey', { value: 'hello', writable: false, configurable: true }) Object.defineProperty(obj, 'newKey', { writable: true, }) obj.newKey = 'change' console.log(obj.newKey) // change
- 一旦使用Objec.defineProperty給對象添加屬性, 若是不設置屬性的話, 那麼configuable, enumerable, writable這些都是默認的false
- 不能被枚舉, 不能被重寫, 不能被再次更改屬性
當使用存取器描述特性的時候, 容許使用如下特性屬性:函數
var obj = {} Object.defineProperty(obj, 'newKey', { get: function() {} | undefined, set: function() {} | undefined, configurable: true | false, enumerable: true | false })
writable
和value
這兩個屬性// 在特性中使用get/set屬性來定義對應的方法 var obj = {} var initVlue = 'hello' Object.defineProperty(obj, 'newKey', { get: function () { // 當獲取值的時候, 觸發這個函數 return initVlue }, set: function (value) { // 設置值的時候, 觸發這個函數 initVlue = value } }) // 獲取值 console.log(obj.newKey) // hello obj.newKey = 'change' console.log(initVlue)// change
在IE8下只能對DOM對象使用, 若是對原生對象使用Object.defineProtry()會報錯this