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

Javascript 如何在严格模式下重写Function.length以返回数组的长度,javascript,arrays,function,overriding,Javascript,Arrays,Function,Overriding,我正在寻找一种在JavaScript中重写对象的.length属性的方法 我当前在parent.properties.objects数组上有一个包装器 (父级用于使代码在上下文中更具可读性) 这是基本结构: (父变量在命名空间中定义并初始化) 包装纸 如果未传递任何参数,则假定get if (arguments.length === 0) { var _objects = parent.properties.objects; return _objects; 修改或过滤对象

我正在寻找一种在JavaScript中重写对象的.length属性的方法

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

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

这是基本结构:

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

包装纸 如果未传递任何参数,则假定get

  if (arguments.length === 0) {
    var _objects = parent.properties.objects;
    return _objects;
修改或过滤对象

    } else if (arguments.length > 0) {
      ...
    }
  };
这将创建object.prototype(不是[prototype])变量并添加方法长度()

错误


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

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

Object.defineProperty(MyObject.prototype, 'length', {get: function() {
   return this.myActualData.length;
}});
下面是一个正在使用的示例:

var x = new MyObject();
x.myActualData.push("Hello");
x.myActualData.push("World");
x.length; // is 2

注意:这只适用于ecmascript 5及以上的浏览器。

您能更具体地说明您遇到的错误类型吗?我使用objects.Length()对其进行了攻击(JavaScript区分大小写)。我这样做是为了编写一个舒适的API,而不是为每个属性get/set操作都提供一个函数。但是每个属性只有一个函数。调用objects.length()会很好,但是objects.length()可以,而不是objects().length()。错误是某种找不到的原型之类的。必须等待ECMA 6。最后一行是什么应该怎么做
parent
是一个函数,我没有看到在任何地方声明
parent.properties.objects.length()的
object
变量
-由于
对象
是一个数组,其
长度
属性不可调用。您的代码非常混乱。我认为您是说您希望获取属性“length”来调用函数,而不仅仅是返回属性。在ecmascript 5浏览器中,Object.defineProperty可以实现这一点,但有一点除外—您不能更改数组或函数的length属性。如何使其在未知对象的名称(MyObject)上工作,例如在页面加载期间创建对象及其名称?我不确定我是否完全理解你的问题,但你可以对任何对象进行Object.defineProperty调用,而不仅仅是原型。
  objects.prototype.length = function () {
    var length = parent.properties.objects.length;
    return length;
  }
  objects.prototype.__proto__.length = function () {    
    var length = parent.properties.objects.length;
    return length;
  }

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

Object.defineProperty(MyObject.prototype, 'length', {get: function() {
   return this.myActualData.length;
}});
var x = new MyObject();
x.myActualData.push("Hello");
x.myActualData.push("World");
x.length; // is 2