0

由于某种原因,我厌倦了遍历对象文字以获取其长度。我想在 上定义一个length属性Object.prototype,我可以设置初始长度,但是我不知道当对象被修改时如何更新它?

var obj = {a:1, b:2, c:3};
Object.defineProperty(Object.prototype, 'length', {value: 0});

//  obj.length === 0;

obj.d = 4;

//  obj === {a:1, b:2, c:3, d:4};
//  obj.length === 0;

任何字符串/数组对象都会自动执行此操作,如果您知道这是如何发生的,请赐教,如果不知道,那么您可能知道更新此自定义属性的方法吗?

4

3 回答 3

3

如果您想要对象中键数的长度,请使用Object.keys(obj).length.

如果你疯了,想把它放在原型上……

Object.prototype.getKeyLength = function() {
    return Object.keys(this).length;
};

任何字符串/数组对象都会自动执行此操作,如果您知道这是如何发生的,请赐教...

这些是宿主对象/基元,它发生在幕后。

于 2015-06-24T03:25:06.090 回答
1

您的初始猜测足够接近,来自Object.defineProperty()

您可以使用 get 代替 value 来定义一个 getter,当访问定义的属性时调用它。

演示

Object.defineProperty(Object.prototype, 'len', {
  writeable: false,
  get: function() {
    return Object.keys(this).length;
  }
});

var a = {
  't' : 'This',
  's' : 'A tsets'
};

console.log(a.len);

a['2222'] = 3;

console.log(a.len);

于 2015-06-24T03:49:11.960 回答
0

你可以试试这个:

Object.defineProperty(Object.prototype, 'keylength', {
  get: function getKeyLength() {
    return Object.keys(this).length;
  }
});
于 2015-06-24T03:30:50.157 回答