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

Jac*_*ues 2 javascript object-literal

使用这样的文字符号声明一个对象:

var person = {
    name: "",
    gender: "",
    age: 0
}
Run Code Online (Sandbox Code Playgroud)

与像这样的构造函数函数:

var person = function(name, gender, age)
{
    this.name = name;
    this.gender = gender;
    this.age = age;
}
Run Code Online (Sandbox Code Playgroud)

第一个问题:

当这样声明时,即使它们还没有“实例化”,它们是否都占用了相等的内存量?(或者这个概念不适用于 JavaScript)

第二个问题

这两个都可以正确更新如下:

var john = new person(); 
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 6

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

// 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;
};
Run Code Online (Sandbox Code Playgroud)

当这样声明时,即使它们还没有“实例化”,它们是否都占用了相等的内存量?(或者这个概念不适用于 JavaScript)

编号person(小写)是一个具有三个属性的简单对象。Person(大写)是一个函数对象,它有一个关联的(空白)原型对象 ( Person.prototype)。所以理论上,函数会比对象占用更多的内存,因为我们有函数对象,它的关联代码,还有简单的对象(它的原型)。

这不是容易,但。函数对象本身不占用大量内存,代码很小,而空白对象(原型)占用的内存非常非常少。大概你不会有数以百万计的这些,因为(如果我正确理解你的问题)它们应该是其他对象的基础。

这两个都可以正确更新如下:

var john = new person(); 
Run Code Online (Sandbox Code Playgroud)

不是字面意思,不是。但是您可以基于它们中的每一个创建实例。要创建由 支持的新实例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);
Run Code Online (Sandbox Code Playgroud)

只有当至少一个原型属性不是由构造设置时,这才真正变得有趣。该属性可能是任何东西,但让我们以常见的情况为例:一个函数:

// 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);
};
Run Code Online (Sandbox Code Playgroud)

然后:

// 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"
Run Code Online (Sandbox Code Playgroud)

johnsayNameperson,其原型获取;mary获得sayNamePerson.prototype它的原型。