Javascript:如何检测数组调用?

时间:2013-12-11 02:45:27

标签: javascript arrays methods native

我对本机javascript调用有疑问。

我有一个班级:

x = function(arr) { this.arr = arr; return this; }
x.prototype.toArray = function() {
       return this.arr;
};
x.prototype.test = function() { alert('but i m object too!'); };

当我打电话时:

var test = new x(['a','b','c']);

alert(test[0]);

alert(test.test());

需要得到结果'a'和'但我也反对!'对话框。

我希望将此功能用作语法糖,就像在使用选择器作为数组后返回DOM元素时在核心中使用jquery一样。如何实现?

更新:

感谢您的回答,但我需要在github 上的jquery代码blob中使用证明。

3 个答案:

答案 0 :(得分:3)

数组只是一个以特殊方式处理数字属性的对象。您必须使用元素的索引作为属性名称将数组的每个元素复制到实例。您还应该设置length属性,使其成为真正的“类似数组”对象。

var X = function(arr) {
    for (var i = 0, l = arr.length; i < l; i++) {
        this[i] = arr[i];
    }
    this.length = arr.length;
};

var x = new X(['a', 'b', 'c']);
alert(x[0]);

答案 1 :(得分:1)

基本上jQuery原型只有length属性,这使得它像数组一样;要将项目“导入”它们,必须逐个复制它们。

要执行此合并,他们会使用following function

function merge(first, second) 
{
  var len = +second.length,
  j = 0,
  i = first.length;

  for ( ; j < len; j++ ) {
    first[ i++ ] = second[ j ];
  }

  first.length = i;

  return first;
}

接下来,他们定义constructor,它也可以作为函数调用:

function x(arr)
{
    return new x.fn.init(arr);
}

x.fn是指从中继承函数的prototype,如下所示:

x.fn = x.prototype = {
  constructor: x,
  test: function() {
    alert('yay');
  },
  init: function(arr) {
    return merge(this, arr);
  },
  length: 0
};

如您所见,您的test()方法也与初始化的length属性一起存在。唯一剩下的就是bind x.fn.init原型到上面的x.fn

x.fn.init.prototype = x.fn;

完成所有这些后,以下代码按预期工作:

var y = x(['a', 'b', 'c']);

alert(y[0]); // shows 'a'
y.test(); // alerts 'yay'

答案 2 :(得分:0)

为什么不调用你创建的Array()?

尝试:

x = function(arr) { this.arr = arr; }
x.prototype.toArray = function() {
       return this.arr;
};

var test = new x(['a','b','c']);

alert(test.toArray()[0]);

OR

x = function(arr) { this.arr = arr; }
x.prototype.toArray = function() {
       return this.arr;
};

var test = new x(['a','b','c']).toArray();

alert(test[0]);