使用附加方法和语法糖扩展JavaScript数组

4
我需要一个数组来存储一些几何数据。我想简单地继承Array对象,然后用一些新的函数扩展它,比如“height”和“width”(所有子元素的高度/宽度之和),但也有一些方便的方法,比如“insertAt”或“remove”。
在不修改原始Array对象(Array.prototype.myMethod)的情况下,最好的方法是什么?
3个回答

5

您可以直接将更改混入到Array中,但考虑到它并不是每个数组都应该具有的内容,这可能不是最佳选择。因此,让我们从Array继承:

// create a constructor for the class
function GeometricArray() {
   this.width = 0;
   this.height = 0;
}

// create a new instance for the prototype so you get all functionality 
// from it without adding features directly to Array.
GeometricArray.prototype = new Array();

// add our special methods to the prototype
GeometricArray.prototype.insertAt = function() {
  ...
};

GeometricArray.prototype.remove = function {
  ...
};

GeometricArray.prototype.add = function( child ) {
   this.push( child );
   // todo calculate child widths/heights
};

1
抱歉,但似乎对我不起作用。那是我的初始方法,但不知何故,当我在“GeometricArray”上调用任何数组方法时,我会得到以下错误: “TypeError:Object#<GeometricArray>没有方法'push'” 虽然我相信这是我做错了什么。 :-) - Piotr Zurek
@piotr 我今天早些时候演示了相同的技术。也许另一个例子会有所帮助:http://stackoverflow.com/questions/5020954/adding-functions-to-javascripts-array-class-breaks-for-loops/5021375#5021375 - Wayne
我一定会再尝试在比现在更简单的代码上玩耍,以减少其他因素干扰结果的可能性。 - Piotr Zurek

2

你是否将Java的概念应用到Javascript中?

在Javascript中,你不需要从类中继承,只需丰富对象即可。

因此,在我的世界中(一个充满人们将方法硬生生塞入对象中的世界),最好的方式是:

function GeometricArray()
{
  var obj=[]

  obj.height=function() {
    // wibbly-wobbly heighty things

    for(var i=0;i<this.length;i++) {
      // ...
    }

  }

  obj.width=function() {
    // wibbly-wobbly widy things
    // ...
  }

  // ...and on and on...

  return obj
}

我已经接受了上面的答案,因为它更接近我的期望,但这个解决方案同样有效。我很想看到有人解释两种解决方案的优缺点。 - Piotr Zurek
prototypethis 都是 JavaScript 中 new 操作符所做的事情的一部分。 只要您是编写构造函数的人,就没有必要过度思考它们。 - ZJR
那就是,除非你正在丰富Core对象,比如ArrayObject。在这种情况下,您无法覆盖构造函数,但是使用prototype仍然可以丰富这些对象。 (只是,结果发现,这种方式很容易让自己踩到陷阱)我不了解最新情况,但我想某些浏览器可能会将某些核心对象的丰富视为安全威胁。 - ZJR

1
你可以使用原型来将这些函数放入数组中。
例如,要添加高度函数,请执行以下操作:
Array.prototype.height = function() {
    //implementation of height
}

我应该在我的问题中提到这一点。我想创建一个新对象,不会修改原始数组功能。 - Piotr Zurek
那么你应该选择chubbard的解决方案。 - Rian Schmits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接