JavaScript中的proto和prototype详细介绍

__proto__

  • __proto__ 是每个 JavaScript 对象都具有的一个属性,它指向了该对象的原型。实际上,__proto__ 属性是访问对象原型的 getter/setter 方法。

  • 通过 __proto__ 属性,我们可以在运行时动态地获取和修改一个对象的原型链。

  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let animal = {
    eats: true,
    };

    let rabbit = {
    jumps: true,
    };

    rabbit.__proto__ = animal;

    console.log(rabbit.jumps); // true
    console.log(rabbit.eats); // true

prototype

  • prototype 是函数对象特有的属性,在创建一个函数时,该函数会自动获得一个名为 prototype 的属性。

  • 当我们使用关键字 new 来创建一个实例时,这个实例的 __proto__ 会指向其构造函数的 prototype

  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    function Animal(name) {
    this.name = name;
    }

    Animal.prototype.eats = true;

    let rabbit = new Animal("Rabbit");
    console.log(rabbit.eats); // true

总结来说,__proto__ 是每个对象实例都有的内部属性,用于访问其原型;而 prototype 是函数对象特有的属性,用于构建由该函数创建的实例的原型链。JavaScript 中的原型链机制基于这两个概念,它们共同构成了 JavaScript 中对象之间继承关系的基础。