如何在严格模式下重写Function.length以返回数组的长度

Gab*_*ans 5 javascript arrays overriding function

我正在寻找一种方法来覆盖JavaScript中的Object的.length属性.

我目前在parent.properties.objects数组上有一个包装器

(父用于使代码在上下文中更具可读性)

这是基本结构:

(父变量在命名空间中定义并初始化)

var parent = function () {
  this.properties = {
    objects: [];
  };
};
Run Code Online (Sandbox Code Playgroud)

包装纸

(function () {
  "use strict";

  objects = function () {
Run Code Online (Sandbox Code Playgroud)

如果没有传递参数,则假设get

  if (arguments.length === 0) {
    var _objects = parent.properties.objects;
    return _objects;
Run Code Online (Sandbox Code Playgroud)

修改或过滤对象

    } else if (arguments.length > 0) {
      ...
    }
  };
Run Code Online (Sandbox Code Playgroud)

这会创建一个object.prototype(不是[prototype])变量并添加方法长度()

  objects.prototype.length = function () {
    var length = parent.properties.objects.length;
    return length;
  }
Run Code Online (Sandbox Code Playgroud)

错误

  objects.prototype.__proto__.length = function () {    
    var length = parent.properties.objects.length;
    return length;
  }

  parent.objects = objects;
})();
Run Code Online (Sandbox Code Playgroud)

kyb*_*kos 3

假设我正确理解了您的问题,以下代码可能会帮助您:

function MyObject() {
  this.myActualData = [];
}

Object.defineProperty(MyObject.prototype, 'length', {get: function() {
   return this.myActualData.length;
}});
Run Code Online (Sandbox Code Playgroud)

这是一个使用中的示例:

var x = new MyObject();
x.myActualData.push("Hello");
x.myActualData.push("World");
x.length; // is 2
Run Code Online (Sandbox Code Playgroud)

注意:这仅适用于 ecmascript 5 及更高版本的浏览器。