JavaScript:在数组的.length上使用defineProperty访问器?

mik*_*ana 6 javascript arrays google-chrome ecmascript-5 defineproperty

我想(主要是出于学术原因)能够在数组上length使用设置访问器Object.defineProperty(),因此我可以通知大小更改.

我知道ES6对象观察和watch.js,但我想尝试在没有额外库的情况下在ES5中执行此操作,即使这仅适用于V8/Chrome.

示例数组:

var demoArray = ['one', 'two']
Run Code Online (Sandbox Code Playgroud)

Alas Chrome,开箱即用,使得长度不可配置:

Object.getOwnPropertyDescriptor(demoArray, 'length')
Object {value: 2, writable: true, enumerable: false, configurable: false}
Run Code Online (Sandbox Code Playgroud)

它不起作用:

Object.defineProperty(demoArray, 'length', { set: function(){ console.log('length changed!')} })
Run Code Online (Sandbox Code Playgroud)

失败了 'TypeError: Cannot redefine property: length'

如你所见,configurablefalse- 所以失败是可以理解的.但是根据MDN,它应该是可能的.

我怎样才能defineProperty使用数组的length属性?这有用吗?

mik*_*ana 2

由于阅读了更多相关内容,Kangax 的优秀文章致力于子类化数组主题,涵盖了各种技术。一种称为数组原型注入的技术用于在 Ractive.js 等流行库中对 Array 进行子类化。它依赖于非规范但流行的__ proto __的公开,但允许长度上的“访问器”。