请问JS中new 一个对象发生了什么
new一个实例
// es5
const Lijianhua = function () {this.lastname = 'li'this.firstname = 'jianhua'
}
Lijianhua.prototype.say = function () {console.log('hi')
}
const her = new Lijianhua()
her.say()
// es6 是es5的语法糖
class Lijianhua {constructor () {this.lastname = 'li'this.firstname = 'jianhua'}say () {console.log('hi')}
}
const her = new Lijianhua()
her.say()
new操作中发生了什么?
new 一个对象过程中,主要发生了以下步骤:
- 以构造器的prototype属性为原型,创造一个新的、空的对象
- 将它的引用赋给构造器的 this,同时将参数传到构造器中执行
- 如果构造器没有手动返回对象,则返回第一步创建的新对象,如果有,则舍弃掉第一步创建的新对象,返回手动return的对象。
实现一个new方法
class Lijianhua {constructor () {this.lastname = 'li'this.firstname = 'jianhua'}say () {console.log('hi')}
}// 自己定义的new方法
const newMethod = function (Parent, ...rest) {// 1.以构造器的prototype属性为原型,创建新对象;const child = Object.create(Parent.prototype)// 2.将this和调用参数传给构造器执行const result = Parent.apply(child, rest)// 3.如果构造器没有手动返回对象,则返回第一步的对象return typeof result === 'object' ? result : child
}
// 创建实例,将构造函数Parent与形参作为参数传入
const her = newMethod(Lijianhua)
her.say() // 'hi';
console.log(her instanceof Lijianhua) // true
参考:https://www.cnblogs.com/echolun/p/10903290.html
请问JS中new 一个对象发生了什么相关推荐
- JS 中判断一个对象是否为数组对象?
在面向对象中 判断一个对象中 判断一个对象是否为数组 1 可以查找它的原型 (__proto__) 是否为数组对象的原型对象 var arr1 = [1,2,3];console.log(arr1._ ...
- js中判断一个对象是否存在
一.Boolean()方法 用Boolean()方法可以将Js中的任意数据类型转为布尔值: 二.用于判断xx是否存在 js一般会自动执行Boolean()方法,我们可以借此判断某个对象在js当前的执行 ...
- 【Javascript高级知识】深入剖析JS中New一个对象的过程(实现原理)
new一个对象的原理是怎样的呢? 用new Object() 的方式新建了一个对象 obj 取出第一个参数,就是我们要传入的构造函数.此外因为 shift 会修改原数组,所以 arguments 会被 ...
- js中取一个对象的部分属性
let obj = { a: 1, b: 2, c: 3, d: 4, e: 5, - }; 有时候对于这样的一个对象,我们只想获得其中的部分属性,有什么好方法呢? 一.delete方法 let ob ...
- JS中给一个对象动态追加key
var data = {}; data['key1'] = "哈哈哈"; var variable = 'key2'; data[variable] = "嘿嘿嘿&quo ...
- js中关于Blob对象的介绍与使用
js中关于Blob对象的介绍与使用 blob对象介绍 一个 Blob对象表示一个不可变的, 原始数据的类似文件对象.Blob表示的数据不一定是一个JavaScript原生格式 blob对象本质上是js ...
- 简单聊聊js中的内置对象
文章目录 一.Map对象 1.常用属性和方法 2.示例 二.Set 1.属性和方法 2.示例 三.Date对象 1.创建Date对象 1.1.*new Date() ;* 2.2.*new Date( ...
- JS中的THIS处理及正则表达式 — 2、综合实战:华为商城产品排序
1.整体页面结构 需要用到ajax.json处理.es6模板字符串拼接.sort排序原理.升降序切换(涉及到很多编程思想编程技巧) 目录 2.AJAX获取数据和ES6模板字符串拼接 index.js ...
- 在js中如何判断一个对象是否为空
网上已经有很多的回答了分别是 for in (jquery中就是这么实现的) for of JSON.stringify() == '{}' Object.getOwnPropertyNames() ...
最新文章
- java并发读取相同的文件_高效读取大文件,再也不用担心 OOM 了!
- python 提交表单登录不成功_Python http requests模拟登录与提交表单的实现问题
- FTPHelper-FTP帮助类,常用操作方法
- 【翻译】CodeMix使用教程(三):Emmet
- 第一章——数据结构之绪论
- 【推荐】最全的积分墙基础知识大全:积分墙渠道运营那些事儿
- 看这玩意复习你还会挂科?《网络原理篇》
- 快递扫地机器人被损坏_手机动一动,全屋扫干净:石头T4扫地机器人体验记
- 解决outlook无法启动
- vscode运行html的插件_vscode前端常用插件推荐,搭建JQuery、Vue等开发环境
- 蒙文字体怎么安装_我们来聊一聊iOS13的“字体”该怎么用?
- 避免内存泄露及内存的规范化使用
- 通过python和websocket构建实时通信系统[扩展saltstack监控]
- Java程序发生异常就挂了吗?
- 关于CMOS摄像头的DVP接口的工作方式与一般使用方法
- 使用selenium模拟登录QQ空间
- 计算机无法自动矫正时间,怎么设置电脑上的时间自动同步进行校正
- 龙芯3A3000 PCI 硬件问题
- canvas实现粒子跟随鼠标动画
- 前端可以做的SEO搜索引擎优化(摘取)
热门文章
- 论文阅读:EMPIRICAL ANALYSIS OF UNLABELED ENTITY PROBLEM IN NAMED ENTITY RECOGNITION
- 绝地求生服务器不稳定奖励,绝地求生间歇性掉帧 几个小窍门轻松解决
- Nginx配置http和https
- edge浏览器打不开,有网络能正常上网,但是edge浏览器无法浏览
- 基于javaweb的茶叶溯源系统(java+ssm+jsp+bootstrap+layui+mysql)
- Mysql安装配置详解
- 直流无刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(一)
- html 字体思源_css设置文字思源雅黑,分为medium, regular, light
- 关于iPhone系统statusbar
- vivox23android系统耗电25,vivox23有哪些省电方法?