使用如下的文字符号声明对象:
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();
答案 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
; mary
从sayName
获取Person.prototype
,其原型。