将对象作为函数调用

时间:2014-06-19 16:56:52

标签: javascript

我的课程定义如下:

function S(items) {
    this.items = items;
    this.item = function(pos) {
        return this.items[pos];
    }
}

要检索项目,我通常会这样做,

var s = new S([10, 20, 30]);
console.log(s.item(0));
console.log(s.item(1));

我想改变我访问项目的方式:

var s = new S([10, 20, 30]);
console.log(s(0));
console.log(s(1));

3 个答案:

答案 0 :(得分:2)

您只能调用功能。做你想要完成的最接近的方法是让你的函数S返回另一个接收位置作为参数的函数,并返回该位置的项目。这样您就需要停止使用new关键字。

function S(items) {
    return function(pos) {
        return items[pos]
    }
} 

var s = S([10, 20, 30])
console.log(s(0))
console.log(s(1))

无论如何,我无法理解为什么你愿意这样做。如果您尝试冻结数组以便无法对其进行修改,那么我认为使用Object.freeze将是更好的选择。

FIDDLE: http://jsfiddle.net/84wVU/

答案 1 :(得分:0)

你不能。

但你可以接近。

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

var s = new S([10,20,30]);
console.log(s[0]); // note square brackets

只能使用()调用函数。

答案 2 :(得分:0)

虽然您确实可以循环遍历项目并获取数组中的每个项目并将其作为此[index] = items [index]附加到类中。另一个选择是扩展Array原型以将当前函数附加到它:

Array.prototype.item = function(pos){
   return this[pos];
}

现在你可以在数组上调用item函数:

[1,2,3,4].item(1) // will return 2
[1,2,3,4].item(2) // will return 3

依旧......