📅  最后修改于: 2023-12-03 15:01:47.796000             🧑  作者: Mango
在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
在上面的代码中,我们定义了两个构造函数 Person
和 Programmer
。构造函数 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)对象。对象可以从其原型对象中继承属性和方法。原型链是一种机制,用来描述对象从其原型对象中继承属性和方法的方式。原型继承是一种常见的模式,可以减少重复代码并使代码更易于维护。