MST

星途 面试题库

面试题:JavaScript中构造函数与实例方法的区别之基础运用

请创建一个JavaScript构造函数`Person`,包含属性`name`和`age`,并为其添加一个实例方法`introduce`用于打印个人信息。同时解释构造函数和实例方法在内存分配和调用方式上有何不同。
14.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.introduce = function() {
    console.log(`我叫 ${this.name},今年 ${this.age} 岁。`);
};

构造函数和实例方法在内存分配和调用方式上的不同

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