2014-09-23 3 views
0

объявляющих объекта с помощью буквального обозначения, как это:Использование памяти для объектов JavaScript буквального обозначения против конструктора функций

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(); 
+2

Объекты и функции конструктора - это две разные вещи (концептуально), и не имеет смысла сравнивать их. В основном в первом случае вы создали один объект, тогда как функция-конструктор позволяет динамически создавать множество объектов. –

+0

Я вижу, откуда вы пришли, и соответственно обновил свой ответ. –

ответ

3

Чтобы избежать путаницы, давайте использовать разные имена:

// 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 получает sayName от person, его прототипа; mary получает sayName от Person.prototype, его прототип.

+1

+1 для объяснения разницы. Теперь вам просто нужно упомянуть, что OP не должен заботиться о памяти :-) – Bergi

+1

@ T.J. Кроудер Спасибо, что было очень полезно. Пометка как правильная. – Jacques

Смежные вопросы