簡體   English   中英

init是Javascript Object Literals的特殊保留關鍵字嗎?

[英]Is init a special reserved keyword for 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等價的初始化函數嗎? 在紅寶石中,我可以打電話

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 Inheritance ,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"]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM