簡體   English   中英

JavaScript對象文字表示法與構造函數的內存使用情況

[英]Memory usage for JavaScript object literal notation vs. constructor functions

使用文字表示法聲明對象,如下所示:

var person = {
    name: "",
    gender: "",
    age: 0
}

與如下的構造函數:

var person = function(name, gender, age)
{
    this.name = name;
    this.gender = gender;
    this.age = age;
}

第一個問題:

當這樣聲明時,即使它們尚未“實例化”,它們是否都占用了相等的內存? (或者這個概念不適用於JavaScript)

第二個問題

可以正確更新這兩個方法,如下所示:

var john = new person(); 

為避免混淆,讓我們使用其他名稱:

// An object we might use as a prototype
var person = {
    name: "",
    gender: "",
    age: 0
};

// A constructor function, note the capital P
var Person = function(name, gender, age)
{
    this.name = name;
    this.gender = gender;
    this.age = age;
};

當這樣聲明時,即使它們尚未“實例化”,它們是否都占用了相等的內存? (或者這個概念不適用於JavaScript)

person (小寫)是具有三個屬性的簡單對象。 Person (大寫)是一個功能對象,它具有一個關聯的(空白)原型對象( Person.prototype )。 因此,從理論上講,該函數將比對象占用更多的內存,因為我們擁有函數對象,其關聯的代碼以及簡單的對象(其原型)。

不過,這無關緊要 函數對象本身並不占用大量內存,代碼很小,空白對象(原型)所占用的內存非常少。 大概您不會擁有數百萬個這樣的對象,因為(如果我正確地理解了您的問題的要點)它們是作為其他對象的基礎的。

可以正確更新這兩個方法,如下所示:

 var john = new person(); 

從字面上看 ,不是。 但是您可以基於每個實例創建實例。 要創建一個由person支持的新實例,可以使用Object.create 要通過Person創建一個新實例並得到Person.prototype支持,則可以使用new

// Using the `person`
var john = Object.create(person);
john.name = "John";
john.gender = "M";
john.age = 47;

// Using `Person` (the constructor function)
var mary = new Person("Mary", "F", 32);

僅當至少一個原型屬性未通過構造設置時,這才真正變得有趣。 該屬性可能是任何東西,但讓我們以常見的情況為例:一個函數:

// An object we might use as a prototype
var person = {
    name: "",
    gender: "",
    age: 0,
    sayName: function() {
        console.log("My name is " + this.name);
    }
};

// A constructor function, note the capital P
var Person = function(name, gender, age)
{
    this.name = name;
    this.gender = gender;
    this.age = age;
};
Person.prototype.sayName = function() {
    console.log("My name is " + this.name);
};

然后:

// Using the `person`
var john = Object.create(person);
john.name = "John";
john.gender = "M";
john.age = 47;
john.sayName(); // "My name is John"

// Using `Person` (the constructor function)
var mary = new Person("Mary", "F", 32);
mary.sayName(); // "My name is Mary"

johnperson ,其原型獲得sayName mary 從其原型Person.prototype獲取sayName

暫無
暫無

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

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