[英]JavaScript Object Literal notation vs plain functions and performance implications?
[英]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"
john
從person
,其原型獲得sayName
; mary
從其原型Person.prototype
獲取sayName
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.