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
类作为所有游戏角色的基类,包含一些通用的属性(如生命值、攻击力)和方法(如移动、攻击)。其他具体角色类(如 Warrior
、Mage
)可以通过原型链继承 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
。