Skip to content

函数的原型和对象的原型分别是什么?它们之间有何关联?结合代码进行说明。

参考答案:

1. 对象的原型

  • 每个对象都有一个内部属性 [[Prototype]](在 JS 中可以通过 __proto__ 访问),指向它的原型对象。
  • 通过原型对象,对象可以访问继承来的属性和方法。
  • 对象的原型通常由 构造函数的 prototype 属性 指定。
js
function Person(name) {
  this.name = name;
}

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

const p = new Person('Alice');

console.log(p.__proto__ === Person.prototype); // true
p.sayHello(); // Hello, Alice

解释

  • p 是对象实例,它的 __proto__ 指向 Person.prototype,所以能调用 sayHello 方法。

2. 函数的原型

  • 函数本身也是对象,每个函数都有一个 prototype 属性(注意和 __proto__ 不同)。
  • prototype 是给 使用该函数作为构造函数 创建的对象实例提供原型的。
  • 函数对象还有一个 __proto__,指向 Function.prototype
js
function Foo() {}

console.log(typeof Foo);          // "function"
console.log(Foo.prototype);       // {constructor: Foo},默认有 constructor 属性
console.log(Foo.__proto__ === Function.prototype); // true

解释

  • Foo.prototype 是实例 new Foo() 的原型对象。
  • Foo.__proto__ 是函数自身的原型,指向 Function.prototype,因为函数也是对象。

3. 函数和对象原型之间的关联

  • 对象的原型来自 构造函数的 prototype
  • 构造函数本身是函数对象,它的原型是 Function.prototype
  • 所有函数的原型链最终都指向 Object.prototype
js
function Person(name) {
  this.name = name;
}
const p = new Person('Bob');

console.log(p.__proto__ === Person.prototype);      // true,实例的原型
console.log(Person.__proto__ === Function.prototype); // true,函数对象的原型
console.log(Function.prototype.__proto__ === Object.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype);   // true

原型链示意

题目要点:

  1. 对象的原型 (__proto__):指向创建它的构造函数的 prototype,用于继承属性和方法。

  2. 函数的原型 (prototype):用于实例化对象时设置实例的原型。

  3. 函数自身也是对象,有 __proto__ 指向 Function.prototype

  4. 原型链关系:

    • 对象实例 → 构造函数的 prototypeObject.prototypenull
    • 函数对象 → Function.prototypeObject.prototypenull