如何为数组/对象创建一个方法/函数

3
这是我的第一个问题,请温柔点。
我正在尝试创建一个对象数组,其中对象包括一个检索数据的方法/函数。
所以最终我不想使用getFirstName(arrayName, arrayNumber),而是使用类似以下的内容:
aliens[x].getFirstName;

或者

persons.first.getFirstName;

如果 Javascript 不支持,或者不能以这种方式实现,请建议下一个最好的解决方案。
var persons = [

{
    firstname : "John",
    lastname  : "Doe",
    age       : 50,
    eyecolor  : "blue",
},

{
    firstname : "Jane",
    lastname  : "Siyabonga",
    age       : 39,
    eyecolor  : "brown",
},
]

var aliens = [

{
    firstname : "Bob",
    lastname  : "the Alien",
    age       : 350,
    eyecolor  : "yellow",
},

{
    firstname : "xblanque",
    lastname  : "the Predator",
    age       : 19,
    eyecolor  : "red",
},

]

function getFirstName(arrayName, arrayNumber)
{
    var x = arrayName[arrayNumber].firstname;
    return x;
}

Array.prototype.getLastName=function()
{
    var x = this.lastname;
    return x;
}

请查看此答案,该答案涉及相同的问题:链接 - isaach1000
2个回答

5

ECMAscript支持gettersetter方法。在任何兼容ES5的实现中,我们可以像这样使用它:

var obj = {
    foo: 42,
    bar: 32,
    get getFoo() {
        return this.foo;
    },
    get sum() {
        return this.foo + this.bar;
    }
};

现在我们可以像这样访问它。
obj.getFoo;  // 42
obj.sum;     // 74

创建这些的另一种方法是通过ES5Object.defineProperty。例如:

Object.defineProperty(obj, 'getBar', {
    get: function() {
        return this.bar;
    }
});

3
读取器和设置器非常好! - coma
我从未听说过ECMAscript,因为我是一个自学的程序员。我现在要去谷歌一下,但我想知道它是否是所有/大多数浏览器的默认设置?如果我要使用它,它会起作用吗? - MisterBrownZA
@MisterBrownZA:ECMAscript和JavaScript是独一无二的。就兼容性而言,它在所有最新版本的浏览器中都能100%地工作。对于大多数老版本的浏览器来说,它也能正常运行。只有像IE 6-7这样的过时浏览器可能会对这种语法有问题。 - jAndy

1

aliens[x].firstname; 运行正常。但是,正如@jAndy建议的那样,您可以使用getter和setter,就像任何面向对象编程语言一样。

function Alien( firstname, lastname, age, eyecolor) { // constructor

    // ...

    this.getFirstName = function() {
        return firstname;
    };
}

var aliens = [
    new Alien("Bob", "the Alien", 350, "yellow"),
    new Alien("xblanque", "the Predator", 19, "red")
];

console.log(aliens[0].getFirstName()); // will output "Bob"

此外,要注意 Array.prototype 的操作:您正在向代码中存在的任何数组添加 getLastName 方法。

这正是我担心的,我认为那是错误的。 只是确认一下,当你说new Alien("","","","")时,你是在调用上面的函数,还是在创建一个对象? - MisterBrownZA
@MisterBrownZA 正在创建一个对象,因为我正在使用 Alien 作为构造函数。你必须明白,在Javascript中,所有东西都像一个对象一样运作。关于函数,你必须注意"闭包"的概念。当一个函数被用 new 操作符调用时,一个对象会在函数的闭包中分配,并且它的引用是 this。此外,new 确保 this 将被返回。 - Tasso Evangelista

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