返回

从委托角度看原型链

前端

在开始讨论原型链之前,我们首先需要明确一个概念:JavaScript有一条用于继承的原型链,但实际上它更像是委托,而不是继承。

继承是指复制属性,而JavaScript实际上并没有复制属性,它只是创建了一个引用,用于引用时查找。

因此,更准确的说,JavaScript的原型链实际上是委托机制。

委托:当一个对象无法处理一个消息时,它会把它委托给另一个对象来处理。

原型链:原型链是一种委托机制,它允许对象访问另一个对象属性和方法。

例如,当我们调用对象的方法时,如果该对象没有该方法,它就会去它的原型对象中查找。如果原型对象也没有该方法,它就会去原型对象的原型对象中查找,依此类推。

JavaScript中的原型链从哪里来?

Object.prototype :Object.prototype是所有JavaScript对象的祖先,它提供了所有JavaScript对象共有的方法和属性。

constructor :每个JavaScript对象都有一个constructor属性,它指向该对象的构造函数。

prototype :每个JavaScript函数都有一个prototype属性,它指向该函数创建的对象的原型对象。

prototype的默认值是Object.prototype :这意味着所有JavaScript对象的最终原型对象都是Object.prototype。

JavaScript原型链的特点

  • 原型链是隐式的:这意味着它不是显式定义的,而是由JavaScript引擎自动维护的。

  • 原型链是单向的:这意味着对象只能访问它的原型对象的属性和方法,而不能访问更高级的原型对象的属性和方法。

  • 原型链是动态的:这意味着原型链可以在运行时被修改。

JavaScript原型链的应用

原型链在面向对象编程中非常有用,它可以帮助我们组织代码,使代码更易于维护和扩展。

例如,我们可以使用原型链来创建一个动物类,然后从动物类派生出猫类、狗类、鱼类等子类。

function Animal() {
  this.name = "";
  this.age = 0;
}

Animal.prototype.eat = function() {
  console.log("Animal is eating");
};

function Cat() {
  this.name = "cat";
  this.age = 1;
}

Cat.prototype = new Animal();

Cat.prototype.meow = function() {
  console.log("Cat is meowing");
};

const cat = new Cat();

cat.eat(); // Animal is eating
cat.meow(); // Cat is meowing

在这个例子中,Cat类从Animal类派生,Cat类的prototype属性指向Animal类的实例。

这使得Cat类可以访问Animal类的属性和方法,同时也拥有自己的属性和方法。

原型链是JavaScript中一个非常强大的机制,它可以帮助我们创建灵活、可扩展的面向对象应用程序。