我想(主要是出於學術的原因)能夠使用Object.defineProperty()
來設置陣列的length
上的存取器,所以比我可以通知大小更改。JavaScript:在數組的.length中使用defineProperty訪問器?
我知道ES6對象觀察和watch.js,但我想嘗試在沒有額外的庫的情況下在ES5中做到這一點,如果可能的話,即使這隻適用於V8/Chrome。
甲樣本陣列:
var demoArray = ['one', 'two']
唉鉻,開箱,使得長度不可配置:
Object.getOwnPropertyDescriptor(demoArray, 'length')
Object {value: 2, writable: true, enumerable: false, configurable: false}
而且它不工作:
Object.defineProperty(demoArray, 'length', { set: function(){ console.log('length changed!')} })
失敗與'TypeError: Cannot redefine property: length'
正如你所見,configurable
是false
- 所以失敗是可以理解的。但according to MDN it should be possible。
我如何獲得defineProperty
處理陣列的length
屬性?這應該工作嗎?
我認爲MDN頁面(並從那裏的鏈接),僅涉及到重新定義'writable'財產描述符(也可能是'value'),但將數據屬性更改爲訪問器屬性是絕對禁止的。 – Bergi
我做了一個編輯(在你接受之後)可能會清除MDN段落:它似乎在討論一個bug,它使用'defineProperty'來阻止設置'value',根據規範它應該*是可能的,但是有些實現有時會被錯誤地阻塞(就好像它錯誤地使用'writable:false')。然而,定義一個setter是正確的,符合規範。 – apsillers
是啊http://whereswalden.com/2013/08/05/new-in-firefox-23-the-length-property-of-an-array-can-be-made-non-writable-but-you- shouldnt-do-it/comment-page-1 /#comment-162704談論同樣的事情。設置一個* data *屬性工作正常:'Object.defineProperty(demoArray,'length',{value:0});'但是設置一個訪問器屬性將不起作用並且破壞規範。 – mikemaccana