返回

构建JavaScript原生核心:从理解prototype和__proto__入手

前端

在JavaScript中,每个函数都有一个prototype属性,该属性是一个指针,指向一个对象。这个对象通常称为函数的原型,或更确切地说,该函数的实例的原型。函数的原型对象包含一组属性和方法,这些属性和方法可以被函数的所有实例继承。

而__proto__属性是指向原型对象的指针。每个对象都有一个__proto__属性,该属性指向其构造函数的原型对象。如果一个对象没有构造函数,那么它的__proto__属性将指向Object.prototype。

在JavaScript中,可以使用prototype和__proto__属性来实现对象的继承。当一个对象被创建时,它的__proto__属性被设置为指向其构造函数的原型对象。因此,该对象可以访问和使用原型对象中的所有属性和方法。

prototype和__proto__之间的区别

  • prototype是函数的属性,而__proto__是对象的属性。
  • prototype指向函数的原型对象,而__proto__指向对象的原型对象。
  • prototype只能在函数内部访问,而__proto__可以在任何地方访问。

prototype和__proto__的应用场景

  • prototype通常用于向函数的所有实例添加属性和方法。
  • __proto__通常用于修改对象的原型对象。

实际案例

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

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

const person1 = new Person('John');
person1.greet(); // Hello, my name is John.

person1.__proto__ = Object.prototype;

person1.greet(); // TypeError: person1.greet is not a function

在这个示例中,我们创建了一个Person函数,该函数有一个name属性和一个greet方法。然后,我们创建了一个Person的实例person1。接下来,我们使用__proto__属性将person1的原型对象设置为Object.prototype。最后,我们再次调用person1的greet方法,但这一次会抛出一个错误,因为Object.prototype没有greet方法。

这个示例说明了__proto__属性可以用来修改对象的原型对象。通过修改对象的原型对象,我们可以改变对象的行为。

结论

prototype和__proto__是JavaScript中的两个重要概念。理解这两个概念之间的区别可以帮助您编写出更高质量的代码。