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