function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.introduce = function() {
console.log(`我叫 ${this.name},今年 ${this.age} 岁。`);
};
构造函数和实例方法在内存分配和调用方式上的不同
- 内存分配
- 构造函数:每次通过
new
关键字调用构造函数Person
时,会在堆内存中创建一个新的对象实例。构造函数中的属性(如name
和age
)会被直接添加到这个新创建的实例对象上,每个实例对象都有自己独立的这些属性副本。
- 实例方法:实例方法(如
introduce
)定义在构造函数的prototype
对象上。所有通过该构造函数创建的实例对象共享这个prototype
对象上的方法。这意味着无论创建多少个Person
实例,introduce
方法在内存中只有一份,节省了内存空间。
- 调用方式
- 构造函数:通过
new
关键字调用构造函数,例如new Person('张三', 20)
。new
关键字会执行以下操作:创建一个新的空对象,将这个新对象的__proto__
属性指向构造函数的prototype
对象,将构造函数的this
关键字指向这个新对象,并执行构造函数中的代码,最后返回这个新对象。
- 实例方法:通过实例对象来调用,例如
let person1 = new Person('李四', 25); person1.introduce()
。当调用实例方法时,JavaScript引擎会首先在实例对象自身上查找该方法,如果找不到,则会沿着__proto__
链在构造函数的prototype
对象上查找,找到后执行该方法,并且方法中的this
关键字指向调用该方法的实例对象。