我对本机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中使用证明。
答案 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]);