热搜:前端 nest neovim nvim

JS系列之一、原型与原型链

lxf2023-06-02 01:59:29

一、原型是什么?原型链是什么?

  1. 原型是什么?
  • 我们创建的每一个构造函数都有一个prototype(原型)属性。这个属性是一个指针,指向了对象。那么prototype就是通过构造函数创建的实例对象原型对象。这里面有几个关系:构造函数、实例对象、原型对象。可能这时候大家有点迷惑,我们接下来继续往下看。
  1. 原型链是什么?
  • 通过__proto__的链式调用,最终调用到Object.prototype.__proto__这个链就是原型链,(参考下图3.1中的蓝色和黑色的链)

二、概念扫盲

  1. 构造函数 什么是构造函数呢?相信不用说,只要有些基础都能理解一些,举例说明,我们写一个最简单函数
function Person() {
}

这里Person就是一个构造函数 2. 实例对象 有了构造函数了,我们根据构造函数可以创建几个实例。

const person1 = new Person();
const person2 = new Person();

那么这里person1person2就是两个根据构造函数创建出来的实例对象。 3. 原型对象 了解了什么是构造函数实例对象,我们再回过头读上面的概述prototype就是通过构造函数创建的实例对象的原型对象,这里重点是实例的原型对象,所以可以理解为一个特别的对象。

三、构造函数、原型对象、实例之间的关系

  1. 根据三者之间的关系,梳理关系图如下:

这里需要注意prototype是函数特有的属性,__proto__是对象特有的属性

JS系列之一、原型与原型链

四、原型相关

  1. prototype
  • 每个函数都有一个 prototype 属性,函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是上面例子中的 person1 和 person2 的原型。
  1. __proto__
  • 这是每一个JavaScript对象(除了 null )都具有的一个属性,叫__proto__,这个属性会指向该对象的原型。
  1. cunstructor
  • 每个原型都有一个 constructor 属性指向关联的构造函数
  1. 原型与in操作符
  • 只要通过对象能够访问的属性,就会返回true(说白了就是如果in操作符检测的是实例对象自身属性+原型上的属性,只有存在就返回true)
function Person() {}
Person.prototype.name='我是原型属性'var person1= new Person();
console.log('name' in person1) // true
  1. hasOwnProperty方法
  • 该方法检测一个属性是否存在于实例对象中(说白了就是只检测自身的属性)
function Person() {}
Person.prototype.name='我是原型属性'var person1= new Person();
console.log(person1.hasOwnProperty('name')) // false

最后,记录到这里。有问题欢迎指正。

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!