返回

探寻JS对象原型与函数原型的奥秘:深入理解其精妙关联

前端

JavaScript中的原型

在JavaScript中,每个对象都有一个特殊的内置属性[[prototype]](原型),它指向该对象的原型对象。原型对象包含了该对象所继承的属性和方法。如果一个对象没有显式指定原型对象,那么它的原型对象就是Object.prototype。Object.prototype是所有对象的根原型对象,它包含了一些通用的属性和方法,如toString()和valueOf()。

对象的原型

对象的原型可以被看作是一个模板,它定义了该对象可以拥有的属性和方法。当我们创建对象时,这个对象将继承其原型的属性和方法。例如,如果我们创建一个名为person的对象,其原型是Object.prototype,那么person对象将继承toString()和valueOf()方法。

我们可以使用Object.getPrototypeOf()方法来获取对象的原型对象。例如,以下代码获取person对象的原型对象:

let person = {
  name: "John Doe",
};

let personPrototype = Object.getPrototypeOf(person);

console.log(personPrototype); // {toString: ƒ, valueOf: ƒ, ...}

函数的原型

函数也有一个原型对象,它被称为函数的“prototype”属性。函数的prototype属性是一个对象,它包含了该函数的所有实例所共有的属性和方法。例如,如果我们有一个名为add()的函数,那么add().prototype对象将包含add()函数的所有实例所共有的属性和方法。

我们可以使用Function.prototype.prototype属性来获取函数的prototype属性。例如,以下代码获取add()函数的prototype属性:

function add(a, b) {
  return a + b;
}

let addPrototype = Function.prototype.prototype;

console.log(addPrototype); // {}

原型链

在JavaScript中,对象和函数都拥有一个原型链。原型链是一个对象或函数到其原型对象的引用链。例如,如果我们创建一个名为person的对象,其原型是Object.prototype,那么person对象的原型链将是:

person -> Object.prototype -> null

这意味着person对象可以访问Object.prototype中的属性和方法,而Object.prototype可以访问null中的属性和方法(null没有原型对象)。

总结

在JavaScript中,对象和函数都拥有一个原型对象。对象的原型对象包含了该对象所继承的属性和方法,而函数的prototype属性包含了该函数的所有实例所共有的属性和方法。对象和函数都拥有一个原型链,原型链是一个对象或函数到其原型对象的引用链。通过理解对象的原型和函数的原型,我们可以更深入地理解JavaScript的继承机制和面向对象编程。