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

时间:2014-02-10 16:57:18

标签: javascript ruby class initialization object-literal

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

2 个答案:

答案 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"]);