📜  javascript中的原型链(1)

📅  最后修改于: 2023-12-03 15:01:47.796000             🧑  作者: Mango

JavaScript中的原型链

在JavaScript中,每个对象都有一个关联的原型(prototype)对象。对象可以从其原型对象中继承属性和方法。原型链是一种机制,用来描述对象从其原型对象中继承属性和方法的方式。

原型

在JavaScript中,每个对象都有一个原型对象。可以通过访问对象的 proto 属性来获取该对象的原型对象。原型对象是另一个普通对象,它具有自己的原型,并且这个原型也是一个普通对象,直到形成一个原型链。原型链的顶部是 Object.prototype。许多JavaScript内置对象从 Object.prototype 继承了方法和属性。

let obj = {}; // 创建一个空对象
console.log(obj.__proto__); // Object.prototype
原型链

原型链是由原型对象构成的链,其中每个对象的原型都是链中前一个对象。

let obj = {}; // 创建一个空对象
console.log(obj.__proto__); // Object.prototype
console.log(Object.prototype.__proto__); // null

在上面的代码中,我们创建了一个空对象,并通过 __proto__ 属性访问了它的原型对象 Object.prototype。然后,我们在原型对象上继续访问它的原型,获取到了 null。这意味着 Object.prototype 上没有原型对象,是原型链顶端。

原型继承

在JavaScript中,原型继承是一个常见的模式。原型继承允许子类对象从其父类对象中继承方法和属性。这种继承方式可以减少重复代码并使代码更易于维护。

下面是一个使用原型继承的示例:

function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
}

function Programmer(name, language) {
  Person.call(this, name);
  this.language = language;
}

Programmer.prototype = Object.create(Person.prototype);
Programmer.prototype.constructor = Programmer;

Programmer.prototype.writeCode = function() {
  console.log(`${this.name} is writing ${this.language} code`);
}

let programmer = new Programmer('Peter', 'JavaScript');
programmer.sayHello(); // Hello, my name is Peter
programmer.writeCode(); // Peter is writing JavaScript code

在上面的代码中,我们定义了两个构造函数 PersonProgrammer。构造函数 Person 保存了一个名字,并定义了一个 sayHello 方法。构造函数 Programmer 继承 Person,并保存了编程语言。Programmer 还定义了一个 writeCode 方法来打印出正在编写的语言。

Programmer构造函数的内部,我们使用 Person.call(this, name) (这是一种方式让 Person 构造函数在 Programmer 中运行)调用了 Person 构造函数,以便 Programmer 实例可以访问 name 属性,然后我们将 Programmer.prototype 设置为了一个新的对象,该对象使用 Object.create (Person.prototype)Person 原型对象中继承了属性和方法,包括 sayHello。最后,我们重置 Programmer.prototype.constructor

在生成的 Programmer 实例中,我们可以调用从 Person.prototype 继承的 sayHello 函数,并调用 Programmer.prototype 上定义的 writeCode 函数。

总结

在JavaScript中,每个对象都有一个关联的原型(prototype)对象。对象可以从其原型对象中继承属性和方法。原型链是一种机制,用来描述对象从其原型对象中继承属性和方法的方式。原型继承是一种常见的模式,可以减少重复代码并使代码更易于维护。