欢迎访问宙启技术站
智能推送

js中原型和原型链指的是什么

发布时间:2023-05-18 07:37:18

JavaScript 中的原型和原型链是理解 JavaScript 的重要部分,它们是 JavaScript 实现继承的基础。在本篇文章中,我将会向您介绍 JavaScript 中的原型和原型链。为简洁的表述,我仅介绍原型和原型链的一些核心概念,以及如何使用它们实现 JavaScript 的继承。

什么是原型?

在 JavaScript 中,每个函数都有一个关联的原型对象(prototype object),它是函数对象的一个特殊属性。如果我们创建一个新的函数对象,它就会自动获得一个原型对象。

原型对象是一个包含属性和方法的对象,像一个普通对象一样。然而,它有一个特殊的 constructor 属性,该属性指向创建这个原型对象的构造函数。通过原型对象,我们可以实现对象之间的共享属性、方法、以及状态的共享。

原型对象是 JavaScript 中一种特殊方式的实现继承,每个对象都有一个原型对象,通过这个原型对象,它可以继承原型对象中定义的所有属性和方法。使用原型对象,我们可以将一个对象连接到另一个对象上,形成一个对象链。这个对象链就是 JavaScript 中的原型链。

什么是原型链?

原型链是 JavaScript 中的一种特殊机制,它是由一系列对象组成的链,每个对象都有一个指向它的原型链。这个原型链最终会连接到一个 “null” 值。

在查找一个对象的属性或方法时,JavaScript 引擎会先搜索这个对象自身的属性和方法,如果找不到,它会继续在这个对象的原型对象(__proto__ 指针指向的对象)中查找。如果还没有找到,它会继续在它的原型对象的原型对象中查找,以此类推,一直到原型链的终点:null。在最后一个原型链上,我们定义的 Object 类型中的方法和属性会拥有所有对象继承链中的方法和属性,从而实现了链式访问。

检查对象的 __proto__ 属性可以查看它的原型对象。这个属性最初是非标准的,但在 ECMAScript6 中已经被标准化。如果我们想访问非标准属性的原型对象,我们可以使用标准化的 Object.getPrototypeOf() 方法。这个方法可以返回一个对象的原型对象。

如何使用原型和原型链实现 JavaScript 中的继承?

JavaScript 原型和原型链有一个非常重要的使用场景就是实现继承。在 JavaScript 中,继承是通过原型链完成的。JavaScript 是一种基于原型的语言,并没有类的概念,继承是通过原型链来实现的。

在 JavaScript 中,继承是一种对象之间复用代码的方式,它可以通过继承一个父对象来复用该对象的属性和方法。为了实现继承,我们需要创建一个新的构造函数,然后将它的原型对象指向我们要继承的父构造函数的原型对象。

创建一个父构造函数:

function Person(name) {
  this.name = name;
}
Person.prototype = {
  sayHello: function() {
    console.log('Hello, my name is ' + this.name);
  }
};

创建一个子构造函数并继承父构造函数:

function Employee(name, salary) {
  Person.call(this, name);
  this.salary = salary;
}
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.saySalary = function() {
  console.log('My salary is ' + this.salary);
};

在这个例子中,我们首先定义了一个 Person 构造函数,它有一个 sayHello 的方法。然后,我们创建了一个 Employee 构造函数,并将它的原型对象指向 Person 构造函数的原型对象。在子构造函数内部,我们调用了 Person 构造函数(使用 call() 方法),然后定义了一个新的 saySalary 方法。

继承是基于原型的,这也就意味着我们创建的 Employee 实例不使用 Person 构造函数内部的代码,而是直接使用 Person 的原型对象。因此,对 Employee 实例调用 sayHello() 方法时,它会首先搜索自身的属性和方法,没有找到就到它的原型对象 Person.prototype 中查找。同样,对 Employee 实例调用 saySalary() 方法时,它会首先搜索自身的属性和方法,没有找到就到它的原型对象 Employee.prototype 中查找,最后继续在 Person.prototype 中查找。这样就实现了继承。

该方法还具备了一个优势,也就是说,修改 Person.prototype 的属性和方法,Employee 对象也会相应在原型链上继承更新。