我遇到了以下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
初始化函数初始化是javascript等价的吗?在红宝石中,我可以打电话
my_ruby_zoo = Zoo.new ["lions", "tigers", "bears"]
在javascript中,init函数是否映射到
var my_javascript_zoo = Zoo.new( ["lions", "tigers", "bears"]);
答案 0 :(得分:1)
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
创建的对象(该原型取自{{} 1}} property):
Person.prototype
因为这有点冗长,处理继承层次结构比在其他语言中更加努力(在ES6中已经修复了),有很多库提供辅助函数来连接事物您。 (我称之为Lineage
,还有Resig的Really Simple Inheritance,PrototypeJS的Class
等。)其中一些帮助脚本可能会给某些函数名称带来特殊含义。例如,在Person.prototype.getFullName = function() {
return this.first + " " + this.last;
};
和PrototypeJS的Lineage
中,名为Class
的函数是特殊的。 (我见过initialize
特别的地方。)
但不在JavaScript本身内。
您的ctor
可能如下所示:
Zoo
如果您想添加所有function Zoo(animal_list) {
this.animals = animal_list.slice(0); // Copy the array
}
个实例的可用功能,通常会将它们添加到Zoo
分配的原型中:
new Zoo
答案 1 :(得分:1)
如果你想让你的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"]);