JS原型和原型链详解

命运对每个人都是一样的,不一样的是各自的努力和付出不同,付出的越多,努力的越多,得到的回报也越多,在你累的时候请看一下身边比你成功却还比你更努力的人,这样,你就会更有动力。

导读:本篇文章讲解 JS原型和原型链详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、原型

1.1 什么是原型

原型是javascript中的继承的基础,JavaScript的继承就是基于原型的继承。

说到原型会涉及两个概念:构造函数、原型对象。

1.2 构造函数

 		function Star() {

            //我就是构造函数

        }
        // new一下调用
        new Star()

封装是面向对象思想中比较重要的一部分,js面向对象可以通过构造函数实现的封装。

构造函数方法很好用,但是 存在浪费内存的问题,所以为了解决这个问题,官方提出了原型的概念。

1.3 原型对象

JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象。

这个对象可以挂载函数,对象实例化不会多次创建原型上函数,节约内存。

所以我们可以把那些不变的方法,直接定义在 prototype 对象上,这样所有对象的实例就可以共享这些方法。

        function Star(name, age) {
            this.name = name
            this.age = age
        }
        console.log(Star.prototype);//返回一个对象称为原型对象
        Star.prototype.sing = function () {
            console.log('我会唱跳rap');
        }//创建一个共同的方法
        console.log(new Star());

在这里插入图片描述

我们来new两个对象,看看它们的方法是不是相等,如果是true说明方法是共享的。

        const cxk = new Star('蔡', 18)
        const zxy = new Star('张学友', 18)
        console.log(cxk.sing() === zxy.sing());

在这里插入图片描述

1.4 构造函数和原型里面的this指向谁 ?

构造函数和原型对象中的this都指向实例化的对象

我们来看两段示例体会一下:

		let that;//声明一个that来接受构造函数里面的this
        function Person(name) {
            this.name = name
            that = this
        }
        const o = new Person()
        console.log(that === o);//true

在这里插入图片描述

		let that;
        function Person(name) {
            this.name = name
        }
        Person.prototype.sing = function() {
            that = this
        }
        const o = new Person()
        o.sing()
        console.log(that === o);//true

在这里插入图片描述

2、 constructor属性

2.1 在哪里?

每个原型对象里面都有个constructor 属性(constructor 构造函数)

 		function Person(name) {
            this.name = name
        }
        Person.prototype.sing = function() {
        }
        console.log(Person.prototype);

在这里插入图片描述

2.2 作用

该属性指向该原型对象的构造函数, 简单理解,就是指向我的妈妈,我是有妈妈的孩子。
在这里插入图片描述

2.3 使用场景

如果有多个对象的方法,我们可以给原型对象采取对象形式赋值。

但是这样就会覆盖构造函数原型对象原来的内容,这样修改后的原型对象 constructor 就不再指向当前构造函数了。

此时,我们可以在修改后的原型对象中,添加一个 constructor 指向原来的构造函数。

		function Person(name) {
            this.name = name
        }
        Person.prototype = {
            sing: function() {
                console.log('我会唱跳rap');
            },
            eat: function() {
                console.log('我特能吃');
            }
        }
        console.log(Person.prototype.constructor);

在这里插入图片描述

		function Person(name) {
            this.name = name
        }
        Person.prototype = {
            constructor: Person,
            sing: function () {
                console.log('我会唱跳rap');
            },
            eat: function () {
                console.log('我特能吃');
            }
        }
        console.log(Person.prototype.constructor);

在这里插入图片描述

3、为什么实例对象能够访问原型对象里面的属性和方法?

对象都会有一个属性 proto 指向构造函数的 prototype 原型对象,之所以我们对象可以使用构造函数 prototype 原型对象的属性和方法,就是因为对象有 proto 原型的存在。

对象原型__proto__指向原型对象 prototype

在这里插入图片描述

在每一个prototype原型和对象原型__proto__里面都有constructor属性,constructor都指向创建实例对象/原型的构造函数。

简单理解,就是实例对象或者原型对着你说:’‘你看这是我妈妈“,而构造函数对着你说:”你看这都是我的孩子“。
互相指明它们之间的关系。

4、 原型链

基于原型对象的继承使得不同构造函数的原型对象关联在一起,并且这种关联的关系是一种链状的结构,我们将原型对象的链状结构关系称为原型链。

4.1 原型链-查找规则

  1. 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。
  2. 如果没有就查找它的原型(也就是 __proto__指向的 prototype 原型对象)
  3. 如果还没有就查找原型对象的原型(Object的原型对象)
  4. 依此类推一直找到 Object 为止(null)
  5. __proto__对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线
  6. 可以使用 instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

4.2 原型链结构图

在这里插入图片描述

4.3 概括

所有的JS对象都有一个prototype属性,指向它的原型对象。当试图访问一个对象的属性时,如果没有在该对象找到,它还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/144070.html

(0)

相关推荐

  • React 代码分割&错误边界(6)

    代码分割 import 静动态导入 静态导入:static import import xxx from ‘xxx’导入并加载时,导入的模块会被编译,不是按需编译 动态导入:dyn…

    2022年11月21日
    00
  • 用vite+lerna配合verdaccio发布自己的前端包

    导读:本篇文章讲解 用vite+lerna配合verdaccio发布自己的前端包,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    前端开发 2022年5月23日
    00
  • 62. Vue 饿了么Mint UI组件的基本使用

    前言 前面的篇章基本已经说明在webpack中如何构建Vue框架的时候。除了这些基础框架的要素,为了快速开发app应用。还要借助于更多的开源组件。 本篇章就来介绍一下如何基本使用饿…

    2022年9月26日
    00
  • JS 的 9 种作用域,你能说出几种?

    作用域想必大家都知道,就是变量生效的范围,比如函数就会生成一个作用域,声明的变量只在函数内生效。 而这样的作用域一共有 9 种,其中几种绝大多数前端都说不出来。 下面我们就一起过一…

    2023年2月17日
    00
  • ES6新特性 类(class)详解

    勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

    导读:本篇文章讲解 ES6新特性 类(class)详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    前端开发 2023年4月28日
    00
  • java中的集合框架

    导读:本篇文章讲解 java中的集合框架,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    前端开发 2023年1月19日
    00
  • display 布局 一行展示3个 之后自动换行

    导读:本篇文章讲解 display 布局 一行展示3个 之后自动换行,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    前端开发 2023年1月18日
    00
  • 【LeetCode】热题>Javascript 1.两数之和

    导读:本篇文章讲解 【LeetCode】热题>Javascript 1.两数之和,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    前端开发 2022年5月12日
    00
  • JavaScript对象

    导读:本篇文章讲解 JavaScript对象,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    2023年1月19日
    00
  • 3. Vue 模板渲染:插值表达式、v-text、v-html的基本使用

    前言 最近在赶一个项目,导致更新较慢,实在不好意思。在上一章节讲述了在 Vue 中如果解决网络延迟的问题。 本章节再来讲述「Vue模板渲染」的基础功能。 这个基础功能在前端框架可是…

    2022年9月26日
    00

发表回复

登录后才能评论