JS面向对象

在JS中一切皆对象,但JS并不是一种真正的面向对象(OOP)的语言,因为它缺少类(class)的概念。虽然ES6引入了class和extends,使我们能够轻易地实现类和继承。但JS并不存在真实的类,JS的类是通过函数以及原型链机制模拟的,本小节的就来探究如何在ES5环境下利用函数和原型链实现JS面向对象的特性

在开始之前,我们先回顾一下原型链的知识,后续new和继承等实现都是基于原型链机制。很多介绍原型链的资料都能写上洋洋洒洒几千字,但我觉得读者们不需要把原型链想太复杂,容易把自己绕进去,其实在我看来,原型链的核心只需要记住三点:

每个对象都有__proto__属性,该属性指向其原型对象,在调用实例的方法和属性时,如果在实例对象上找不到,就会往原型对象上找

构造函数的prototype属性也指向实例的原型对象

原型对象的constructor属性指向构造函数

模拟实现new

首先我们要知道new做了什么

创建一个新对象,并继承其构造函数的prototype,这一步是为了继承构造函数原型上的属性和方法

执行构造函数,方法内的this被指定为该新实例,这一步是为了执行构造函数内的赋值操作

返回新实例(规范规定,如果构造方法返回了一个对象,那么返回该对象,否则返回第一步创建的新对象)

// new是关键字,这里我们用函数来模拟,new Foo(args) <=> myNew(Foo, args)

function myNew(foo, ...args) {

// 创建新对象,并继承构造方法的prototype属性, 这一步是为了把obj挂原型链上, 相当于obj.__proto__ = Foo.prototype

let obj = Object.create(foo.prototype)

// 执行构造方法, 并为其绑定新this, 这一步是为了让构造方法能进行this.name = name之类的操作, args是构造方法的入参, 因为这里用myNew模拟, 所以入参从myNew传入

let result = foo.apply(obj, args)

// 如果构造方法已经return了一个对象, 那么就返回该对象, 一般情况下,构造方法不会返回新实例,但使用者可以选择返回新实例来覆盖new创建的对象 否则返回myNew创建的新对象

return typeof result === 'object' && result !== null ? result : obj

}

function Foo(name) {

this.name = name

}

const newObj = myNew(Foo, 'zhangsan')

console.log(newObj) // Foo {name: "zhangsan"}

console.log(newObj instanceof Foo) // true

手写一个promise用法_手写一个Promise相关推荐

  1. 手写一个promise用法_手写一个自己的 JavaScript Promise 类库

    终于有时间写这篇文章了, ES2015 推出了JS 的 Promise ,而在没有原生支持的时候,我们也可以使用诸如 Promises/A+ 的库的帮助,在我们的代码里实现Promise 的支持: 如 ...

  2. 手写一个promise用法_手写一个 Promise

    1 js 的基本数据类型? 2 JavaScript 有几种类型的值? 3 什么是堆?什么是栈?它们之间有什么区别和联系? 4 内部属性 [Class] 是什么? 5 介绍 js 有哪些内置对象? 6 ...

  3. 如何写一个脚本语言_如何写一个Nx schematic plugin?

    前言 玩过Angular的同学都知道Angular作为一个Framework,拥有一套完备的生态,还集成了强大的CLI.而React则仅仅是一个轻量级的Library,官方社区只定义了一套组件的周期规 ...

  4. promise用法_图解 Promise 实现原理(四):Promise 静态方法实现

    作者:Morrain 转发链接:https://mp.weixin.qq.com/s/Lp_5BXdpm7G29Z7zT_S-bQ 前言 Promise 是异步编程的一种解决方案,它由社区最早提出和实 ...

  5. promise用法_【JavaScript 教程】异步操作——Promise 对象

    作者 | 阮一峰 概述 Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口.它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操 ...

  6. promise用法_图解 Promise 实现原理(一)—— 基础实现

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/UNzYgpnKzmW6bAapYxnXRQ 作者:孔垂亮 很多同学在学习 Promise 时 ...

  7. 画一个圆角多边形_用SolidWorks一个扫描画出这个多边形瓶子

    多边形瓶子 2020年10月文件分享 后台发送:2010 获取文件 或底部阅读原文输入提取码 提取码:2010 建模过程 1.在[上视基准面]画两个八边形. 1-1.用样条曲线连接各个端点.(扫描的引 ...

  8. fortran中call的用法_手写源码系列(一)——call、apply、bind

    什么是手写源码 平时面试时经常会遇到让手写一个已有方法的实现,其实面试官是想考察你对于JS底层逻辑是否熟悉,经常面试会出的会在下面: call.apply.bind promise requireJS ...

  9. 未能加载文件或程序集或它的某一个依赖项_手写一个miniwebpack

    前言 之前好友希望能介绍一下 webapck 相关的内容,所以最近花费了两个多月的准备,终于完成了 webapck 系列,它包括一下几部分: webapck 系列一:手写一个 JavaScript 打 ...

最新文章

  1. 关于从Image字段读取图片流并显示在PictureBox控件时报‘参数无效’异常的解决方法...
  2. 计算机二级公共基础知识2017,2017年计算机二级公共基础知识基础试题
  3. LeetCode Evaluate Division(并查集)
  4. [iOS]关于零基础学习iOS开发的学习方法总结
  5. Linux日志 系统日志及分析
  6. C++ gets, getline ( string流)
  7. Android日期对话框NumberPicker的用法教程
  8. react学习(9)----react生命周期
  9. case class和trait
  10. mysql中文乱码解决_Stata 中文乱码顽疾解决方法
  11. 2017.3.24 分裂游戏 思考记录
  12. (转) RabbitMQ学习之工作队列(java)
  13. 7.29~8.2 广州软件所-实习工作日记
  14. linux服务器终止进程,结束linux 服务器系统中一个程序的多个进程
  15. python 绘制并列条形图并添加数据标签
  16. python和vb编程哪个好_自学编程是从python还是从vb好
  17. 数字信号处理matlab版答案,数字信号处理matlab版答案
  18. Word 文档中的图片另存为 .jpg 格式图片方法
  19. Linux Email服务搭建与应用
  20. java中cleanup的使用_【Lombok注解】@Cleanup 自动资源管理:安全无困扰地调用close方法...

热门文章

  1. java 注销变量_[ Java学习基础 ] Java对象的创建和销毁
  2. Android8.0适配-Only fullscreen opaque activities can request orientation
  3. vector 使用 c++11 Lambda 表达式 排序
  4. 如何测试连接MsSQL数据库-------UDL文件
  5. 总结:JavaEE完整体系架构
  6. 6英寸全面屏·2000万四镜头 HUAWEI nova 2s正式发布
  7. 删除数组中的某一个元素
  8. [BEC][hujiang] Lesson02 Unit1:Working life ---Reading
  9. ARM S3C2410硬件手册重点
  10. typescript设置默认值_TypeScript输入参数的默认值一例,以及对应生成的JavaScript代码分析...