我运行了以下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"]);