MST

星途 面试题库

面试题:JavaScript对象创建机制的深度剖析及原型链应用场景

JavaScript有多种创建对象的方式,如字面量、构造函数、Object.create() 等,请对比分析这些创建方式在内部机制上的差异,以及各自对原型链的影响。并且举例说明原型链在实际项目开发中的应用场景,如代码复用等方面。
34.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

1. 创建对象方式的内部机制差异及对原型链影响

  • 字面量方式
    • 内部机制:直接使用花括号 {} 创建对象,简洁明了。在创建时,会在内存中开辟一块空间来存储对象的属性和方法。
    • 对原型链影响:创建的对象会直接链接到 Object.prototype,其 __proto__ 属性指向 Object.prototype。例如:
let obj1 = {name: 'John'};
console.log(obj1.__proto__ === Object.prototype); // true
  • 构造函数方式
    • 内部机制:通过 new 关键字调用构造函数创建对象。new 操作符会创建一个空对象,将其 __proto__ 指向构造函数的 prototype 属性,然后将这个空对象作为 this 上下文执行构造函数,为对象添加属性和方法。
    • 对原型链影响:创建的对象的 __proto__ 指向构造函数的 prototype。例如:
function Person(name) {
    this.name = name;
}
let person1 = new Person('Jane');
console.log(person1.__proto__ === Person.prototype); // true
  • Object.create()方式
    • 内部机制Object.create() 方法创建一个新对象,使用现有的对象来提供新创建对象的 __proto__
    • 对原型链影响:新创建对象的 __proto__ 直接指向传入的参数对象。例如:
let protoObj = {message: 'Hello'};
let newObj = Object.create(protoObj);
console.log(newObj.__proto__ === protoObj); // true

2. 原型链在实际项目开发中的应用场景

  • 代码复用
    • 场景描述:在面向对象编程中,通过原型链实现继承,可以复用父类的属性和方法。比如在一个游戏开发项目中,有一个 Character 类作为所有游戏角色的基类,包含一些通用的属性(如生命值、攻击力)和方法(如移动、攻击)。其他具体角色类(如 WarriorMage)可以通过原型链继承 Character 类,复用这些通用部分,而不需要重复编写代码。
    • 代码示例
function Character(name, health, attack) {
    this.name = name;
    this.health = health;
    this.attack = attack;
}
Character.prototype.move = function () {
    console.log(this.name +'is moving.');
};
function Warrior(name, health, attack, weapon) {
    Character.call(this, name, health, attack);
    this.weapon = weapon;
}
Warrior.prototype = Object.create(Character.prototype);
Warrior.prototype.constructor = Warrior;
let warrior1 = new Warrior('Ares', 100, 20, 'Sword');
warrior1.move(); // Ares is moving.
  • 解释Warrior 类通过原型链继承了 Character 类的 move 方法,实现了代码复用,同时 Warrior 类又有自己独特的属性 weapon