理解js原型链,继承和promis

javascript栏目介绍原型链继承和promis。

理解js原型链,继承和promis

相关免费学习推荐:javascript(视频)

一、原型链

开局一张图
在这里插入图片描述

prototype
每个函数都有一个prototype属性,被称为显示原型

2._ proto _
每个实例对象都会有_ proto _属性,其被称为隐式原型

每一个实例对象的隐式原型_ proto _属性指向自身构造函数的显式原型prototype

constructor
每个prototype原型都有一个constructor属性,指向它关联的构造函数。

原型链
获取对象属性时,如果对象本身没有这个属性,那就会去他的原型__proto__上去找,如果还查不到,就去找原型的原型,一直找到最顶层(Object.prototype)为止。Object.prototype对象也有__proto__属性值为null。

二、继承

1、原型链继承
    
    重点:让新实例的原型等于父类的实例。
    特点:1、实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性。(新实例不会继承父类实例的属性!)
    缺点:1、新实例无法向父类构造函数传参。
       2、继承单一。
       3、所有新实例都会共享父类实例的属性。(原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原型属性也会被修改!)
2、借用构造函数继承
    
    重点:用.call()和.apply()将父类构造函数引入子类函数(在子类函数中做了父类函数的自执行(复制))
    特点:1、只继承了父类构造函数的属性,没有继承父类原型的属性。
       2、解决了原型链继承缺点1、2、3。
       3、可以继承多个构造函数属性(call多个)。
       4、在子实例中可向父实例传参。
    缺点:1、只能继承父类构造函数的属性。
       2、无法实现构造函数的复用。(每次用每次都要重新调用)
       3、每个新实例都有父类构造函数的副本,臃肿。

3、组合继承(组合原型链继承和借用构造函数继承)(常用)
    
    重点:结合了两种模式的优点,传参和复用
    特点:1、可以继承父类原型上的属性,可以传参,可复用。
       2、每个新实例引入的构造函数属性是私有的。
    缺点:调用了两次父类构造函数(耗内存),子类的构造函数会代替原型上的那个父类构造函数。

4、原型式继承
    
    重点:用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。object.create()就是这个原理。
    特点:类似于复制一个对象,用函数来包装。
    缺点:1、所有实例都会继承原型上的属性。
       2、无法实现复用。(新实例属性都是后面添加的)
  
  5、寄生式继承
    
    重点:就是给原型式继承外面套了个壳子。
    优点:没有创建自定义类型,因为只是套了个壳子返回对象(这个),这个函数顺理成章就成了创建的新对象。
    缺点:没用到原型,无法复用。
    
  6、寄生组合式继承(常用)
    寄生:在函数内返回对象然后调用
    组合:1、函数的原型等于另一个实例。2、在函数中用apply或者call引入另一个构造函数,可传参 
    
    重点:修复了组合继承的问题

继承这些知识点与其说是对象的继承,更像是函数的功能用法,如何用函数做到复用,组合,这些和使用继承的思考是一样的。上述几个继承的方法都可以手动修复他们的缺点,但就是多了这个手动修复就变成了另一种继承模式。
    这些继承模式的学习重点是学它们的思想,不然你会在coding书本上的例子的时候,会觉得明明可以直接继承为什么还要搞这么麻烦。就像原型式继承它用函数复制了内部对象的一个副本,这样不仅可以继承内部对象的属性,还能把函数(对象,来源内部对象的返回)随意调用,给它们添加属性,改个参数就可以改变原型对象,而这些新增的属性也不会相互影响。
    
ES6中的 class继承:
父类(基类)

子类

extends 关键字

//class 相当于es5中构造函数//class中定义方法时,前后不能加function,全部定义在class的protopyte属性中//class中定义的所有方法是不可枚举的//class中只能定义方法,不能定义对象,变量等//class和方法内默认都是严格模式//es5中constructor为隐式属性//父类class People{  constructor(name='wang',age='27'){    this.name = name;    this.age = age;  }  eat(){    console.log(`${this.name} ${this.age} eat food`)  }}//子类 通过extends 继承父类class Woman extends People{    constructor(name = 'ren',age = '27'){      //继承父类属性     super(name, age);    }     eat(){      //继承父类方法      super.eat()     } } let wonmanObj=new Woman('xiaoxiami'); wonmanObj.eat();

登录后复制

三、promise

一般来讲,有以下的名词约定:

promise(首字母小写)对象指的是“Promise实例对象”

Promise首字母大写且单数形式,表示“Promise构造函数”

Promises首字母大写且复数形式,用于指代“Promises规范”

什么是Promise?
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
从语法上说,promise 是一个对象,从它可以获取异步操作的的最终状态(成功或失败)。
Promise是一个构造函数,对外提供统一的 API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法。
Promise的两个特点
Promise对象的状态不受外界影响

1)pending 初始状态

2)fulfilled 成功状态

3)rejected 失败状态

Promise 有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态

Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected

使用 new 来创建一个promise对象。

Promise接受一个「函数」作为参数,该函数的两个参数分别是resolve和reject。这两个函数就是就是「回调函数」

resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

const promise = new Promise((resolve, reject) => {    // do something here ...    if (success) {        resolve(value); // fulfilled    } else {        reject(error); // rejected    }});

登录后复制

resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
promise有三个状态:
1、pending[待定]初始状态
2、fulfilled[实现]操作成功
3、rejected[被否决]操作失败
当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
promise状态一经改变,不会再变。
Promise对象的状态改变,只有两种可能:
从pending变为fulfilled
从pending变为rejected。

.then()
1、接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
2、.then()返回一个新的Promise实例,所以它可以链式调用
3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
4、状态响应函数可以返回新的promise,或其他值,不返回值也可以我们可以认为它返回了一个null;
5、如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
6、如果返回其他任何值,则会立即执行下一级.then()

.then()里面有.then()的情况
1、因为.then()返回的还是Promise实例
2、会等里面的then()执行完,再执行外面的

以上就是理解js原型链,继承和promis的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2721768.html

(0)
上一篇 2025年3月7日 22:48:21
下一篇 2025年2月24日 19:40:18

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 了解javascript中3种for循环风格以及何时使用它们

    在学习任何开发语言时候,for循环是必不可少的一种语法,可能所有开发人员都会使用它。它非常经典,以至于每个开发语言都至少包括一种关于循环的语法版本。不过,在JavaScript种包含了三种不同的循环语法(如果再讲究一点,也可以算作是四种)。…

    2025年3月7日 编程技术
    200
  • JS中遍历对象属性的方法介绍

    在2016年6月发布的ECMAScript 2016的同一时期,令JavaScript开发人员开心的是知道另一组很棒的提案已经达到了第4阶段(完成)。 译者注:在翻译这篇文章时,这几个特性已得到了支持。 让我们列出这些功能: Object.…

    2025年3月7日 编程技术
    200
  • 详解使用 JavaScript 解析 URL的方法

    在 Web 开发中,有许多情况需要解析 URL,这篇主要学习如何使用 URL 对象实现这一点。 开始 创建一个以下内容的 HTML 文件,并在浏览器中打开。 JavaScript URL parsing // 激动人心的代码即将写在这里 登…

    2025年3月7日 编程技术
    200
  • 解决JavaScript运行环境

    javascript栏目介绍其运行环境,才有好的开始。 相关免费学习推荐:javascript(视频) 文章目录 文件版本说明JavaScript运行环境镶嵌网页JavaScript文件脚本:.jsJavaScript打印打印方式打印级别编…

    2025年3月7日 编程技术
    200
  • 详解JavaScript中的Proxy(代理)

    Proxy是什么 首先,我们要清楚,Proxy是什么意思,这个单词翻译过来,就是 代理。 可以理解为,有一个很火的明星,开通了一个微博账号,这个账号非常活跃,回复粉丝、到处点赞之类的,但可能并不是真的由本人在维护的。 而是在背后有一个其他人…

    2025年3月7日
    200
  • 5种JavaScript中解构(Destructuring)的使用方法

    读取对象属性和访问数组项是常见的操作。销毁分配使这些操作变得更加轻松和简洁。在本文中,除了基本用法之外,我还将介绍JavaScript中5种有趣的解构用法。 1. 交换变量 通常交换两个变量的方法需要一个额外的临时变量,来看看例子: let…

    2025年3月7日
    200
  • 浅谈JavaScript中工厂函数和构造函数

    当谈到JavaScript语言与其他编程语言相比时,你可能会听到一些令人困惑东西,其中之一是工厂函数和构造函数。 工厂函数 所谓工厂函数,就是指这些内建函数都是类对象,当你调用他们时,实际上是创建了一个类实例”。意思就是当我调用这个函数,实…

    2025年3月7日 编程技术
    200
  • JavaScript循环中如何使用 async/await?需要注意些什么?

    async 与 await 的使用方式相对简单。 但当你尝试在循环中使用await时,事情就会变得复杂一些。 在本文中,分享一些在如果循环中使用await值得注意的问题。 准备一个例子 对于这篇文章,假设你想从水果篮中获取水果的数量。 co…

    2025年3月7日 编程技术
    200
  • JavaScript中var、let和const之间有什么区别?

    区别:1、var变量是函数或全局作用域,let和const变量是块作用域;2、let和const变量受暂存死区的约束,var变量不受;3、var变量是可分配和声明的,letr变量是可分配、不可重新声明的,const变量则不可重新分配和声明。…

    2025年3月7日
    200
  • javascript原型和继承是面试必会的

    javascript栏目介绍面试必会的原型和继承 相关免费学习推荐:javascript(视频) 本文从以下几个方面着手 0怎么理解面向对象1创建对象的方式2记住原型链的小窍门3instanceof 模拟实现4new关键字 模拟实现5继承的…

    2025年3月7日
    200

发表回复

登录后才能评论