JavaScript对象文字符号与构造函数的内存使用情况

时间:2014-09-23 14:03:43

标签: javascript object-literal

使用如下的文字符号声明对象:

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

VS。像这样的构造函数:

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

第一个问题:

当这样声明时,即使它们没有被“实例化”,它们也会占用相同数量的内存吗? (或这个概念不适用于JavaScript)

第二个问题

这两个都可以按照以下方式正确修改:

var john = new person(); 

1 个答案:

答案 0 :(得分:4)

为避免混淆,我们使用不同的名称:

// 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; marysayName获取Person.prototype原型。