【问题标题】:Javascript - Custom arrays not workingJavascript - 自定义数组不起作用
【发布时间】:2015-02-20 21:37:25
【问题描述】:

请检查下面的代码 -

custom_array.push(...) is working
but
custom_array[i] = "n"

不工作。

还有几件事我不确定为什么它不起作用。请注意带有“?”的 cmets这是行不通的。请参考小提琴-http://jsfiddle.net/vc0bbm3d/

【问题讨论】:

  • 你不能在javascript中继承Array
  • 假设我想要一个与数组完全一样的 custom_array,其中包含一些额外的函数。那么呢?
  • @Teemu - 请检查评论,这就是我所说的不工作的意思。
  • 好吧,我没看小提琴。无论如何,something to read.
  • 看在上帝的份上,不要派人去 jsfiddle 让他们坐在五个 alert()s 中。

标签: javascript jquery arrays prototype


【解决方案1】:

使用括号语法设置项目不适用于继承数组的对象,因为它实际上不是数组。

当属性名称是整数时,数组具有处理属性分配的特殊代码(这是您使用括号语法所做的)。如果索引超出当前长度,则调整length 属性。

当您为对象中的属性分配值时,没有特殊的代码来处理长度。属性只是像往常一样分配,长度从未调整。由于对象已经具有处理使用括号语法时发生的事情的代码,因此它继承的数组永远不会发挥作用。

要使括号语法以这种方式工作,对象必须是一个实际的数组。

【讨论】:

  • ... 或主机对象。
  • @guffa - 如果我想让括号语法像普通数组一样工作,那么该怎么做
  • @nikhilrao:Teemu 链接到的文章有一个适用于对象的解决方案,但并非所有浏览器都支持它,例如 IE8 和更早版本。要获得全面支持,您必须使用实际的数组。
【解决方案2】:

试试

ar[3] = 2;
ar.length =4

这样它就知道你添加了一些东西。

【讨论】:

  • 为什么要明确设置长度?它不应该表现得像一个数组并自动设置长度
  • 因为“数组”是建立在关联数组之上的。意思是你可以做 blah[1]= oor blah['bsf']= 并关联任何东西。但是普通的 ol 数组使用长度来知道关联 0 -> length-1 是一个“数组”
【解决方案3】:

下面是我所说的在默认数组对象周围创建一个层以扩展功能的示例:

var SuperArray = function(){
  this.arr = Array.prototype.slice.call(arguments);
};
//abstraction of default array functionality
SuperArray.prototype.set = function(index, value){
  this.arr[index] = value;

  return this;
};

SuperArray.prototype.unset = function(index){
  this.arr.splice(index, 1);

  return this;
};
//extension of default array functionality
SuperArray.prototype.consoleList = function(){
  var arr = this.arr;
  for(var i = 0, l = arr.length; i < l; i++){
    console.log(arr[i]);
  };

  return this;
};

var extArr = new SuperArray(1,2,3);

extArr.set(2, 25); //does array[2] = 25;
extArr.unset(1);   //removes array[1]
extArr.consoleList();//console.logs all items in array

extArr.set(2, 25).unset(1).consoleList();//same thing

这个简单的对象接受参数并将它们直接设置到一个数组中,然后我们可以根据需要对其进行操作。然后你可以添加任何你需要的实用函数,检查现有的数组功能等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 2016-06-18
    • 1970-01-01
    • 2021-11-28
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多