init是Javascript Object Literals的一个特殊保留关键字吗



我运行了以下Javascript代码。

var Zoo = {
animals: [],
init: function (animal_list) {
for (i = 0; i < animal_list.length; i++) {
this.animals.push(animal_list[i]);
}
}

看起来init键映射到了一个可执行函数。该函数将动物列表中的每个项目放入动物数组中。

如果我用母语Ruby,我会做这样的事情:

class Zoo
def initialize animal_list
@animals = animal_list  #animal_list is an array
end
end

那么,init是否等效于初始化函数的javascript?在ruby中,我可以调用

my_ruby_zoo = Zoo.new ["lions", "tigers", "bears"]

在javascript中,init函数是否映射到

var my_javascript_zoo = Zoo.new( ["lions", "tigers", "bears"]); 

init是Javascript Object Literals的一个特殊保留关键字吗?

不,一点也不。JavaScript中没有用于初始化的预先命名的函数。通常,如果您需要JavaScript中的对象"类",则可以使用带有new关键字的构造函数:

function Person(first, last) {
this.first = first;
this.last = last;
}
// Usage:
var chuck = new Person("Charles", "Foreman");

然后,您可以添加所有通过new Person创建的实例都可以使用的函数,方法是将它们作为属性添加到通过new Person创建的对象的原型中(该原型取自Person.prototype属性):

Person.prototype.getFullName = function() {
return this.first + " " + this.last;
};

因为这有点冗长,而且处理继承层次结构比其他语言更费力(ES6中已经修复了这一点),所以有很多库提供了帮助函数来为您连接。(我的被称为Lineage,还有Resig的Really Simple Heritage、PrototypeJS的Class等。)这些辅助脚本中的一些可能会赋予某些函数名特殊的含义。例如,在Lineage和PrototypeJS的Class中,一个名为initialize的函数都是特殊的。(我看过一些ctor的特别之处。)

但不是在JavaScript本身。

您的Zoo可能如下所示:

function Zoo(animal_list) {
this.animals = animal_list.slice(0); // Copy the array
}

如果您想添加所有Zoo实例上可用的函数,通常您会将它们添加到new Zoo:分配的原型中

Zoo.prototype.showAll = function() {
this.animals.forEach(function(animal) {
console.log(animal);
});
};
// Usage:
var z = new Zoo(['Tortoise', 'Emu', 'Lion']);
z.showAll();

如果你想让Zoo类成为构造函数,它应该是一个函数,而不是一个对象文字:

var Zoo = function(animal_list) {
this.animals = [];
for (i = 0; i < animal_list.length; i++) {
this.animals.push(animal_list[i]);
}
}
var myZoo = new Zoo(["lions", "tigers", "bears"]);

最新更新