js中的new操作符解析
new 操作符做了以下事情:
1.创建一个对象,将对象赋值给this
function Person(name, age) {
console.log(this) //Person {}
}
let p = new Person('cj', 24)
2.执行构造函数的代码,将构造器中的this.prop属性添加到this上
function Person(name, age) {
console.log(this) //Person {}
this.name = name
this.age = age
console.log(this) //Person {name: 'cj', age: 24}
}
let p = new Person ('cj', 24)
3.为this对象设置原型为其f.prototype 设置构造函数的constructor指向构造函数本身
function Person(name, age) {
this.name = name
this.age = age
Object.setPrototypeOf(this, String.prototype) //相当于this.__proto__ = String.prototype
Person.prototype.constructor = Person //这个熟悉可以用于分辨类型,现在常用instanceof 来鉴别原型
return this //可有可无,隐式返回
}
let p = new Person('cj', 24) //由Person类型变成了String类型
console.log(p instanceof String) //true
console.log(p) //String {name: 'cj', age: 24}
4.隐式return this
先证明new 调用函数最终操作返回的时候函数的返回值
function Person(name, age) {
this.name = name
this.age = age
return {} //可有可无,隐式返回,这里若是返回基本类型、系统会返回this对象 可以试试 return null
}
let p = new Person('cj', 24)
console.log(p) //{} 证明new操作符对函数操作是返回其函数返回值
完整的new模拟实现
function Person(name, age) {
this.name = name
this.age = age
}
function _new(f) {
return function (...agrs) { //利用闭包分离构造函数和参数
let obj = {} //创建新对象
Object.setPrototypeOf(obj, f.prototype)// 等同于obj.__proto__ = f.prototype 赋予新对象原型
f.prototype.constructor = f //将构造器原型的constructor设置为构造器本身
let result = f.apply(obj, args) //将参数赋值到新对象
return result === 'object' ? result : obj //如果调用的构造函数有引用类型的返回值则返回其返回值,否则返回新对象
}
}
let p = _new(Person)('cj', 24)
console.log(p) //Person {name: 'cj', age: 24}
js中的new操作符解析的更多相关文章
- [JavaScript] JS中对Base64的解析
JS中对Base64的解析 <script type="text/javascript"> /** * UTF16和UTF8转换对照表 * U+00000000 – U ...
- js中的new操作符与Object.create()的作用与区别
js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 ...
- JS中的一元操作符
表达式 一元操作符 优先级 结合性 运算顺序 表达式是什么? 就是JS 中的一个短语,解释器遇到这个短语以后会把对它进行计算,得到一个结果参与运算,我们把这种要参与到运算中的各种各样的短语称为表达式. ...
- JS中的new操作符
在JS中定义一个构造函数,然后用new操作符构造对象obj,JS代码如下. function Base(){ this.name = "swf"; this.age =20; } ...
- js中的prototype原型解析
在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...
- js中State模式的解析及运用
状态模式,在大的范畴中的定义为当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.每种编程语言有不同的实现方式,运用的范围也多用于游戏之中. 这里我用javascript来模拟状 ...
- JS中的闭包 详细解析大全(面试避必考题)
JS中闭包的介绍 闭包的概念 闭包就是能够读取其他函数内部变量的函数. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变 ...
- JS中的new操作符原理解析
var Person = function(name){ this.name = name; } Person.prototype.sayHello = function() { console.lo ...
- JS中的 new 操作符简单理解
首先上一一个简单的 new 操作符实例 var Person = function(name){ this.name = name; this.say = function(){ return &qu ...
随机推荐
- ReentrantLock使用示例
/** * ReentrantLock是独占锁 * Lock锁的使用,把锁和要用锁同步的代码放在一起,这里就是放在Printer类中了 * 获取到锁后,最后要在finally代码块中手动释放锁 */ ...
- 使用 Valgrind 检测 C++ 内存泄漏
Valgrind 的介绍 Valgrind 可以用来检测程序是否有非法使用内存的问题,例如访问未初始化的内存.访问数组时越界.忘记释放动态内存等问题.在 Linux 可以使用下面的命令安装 Valgr ...
- parallels desktop 的新建虚拟机的步骤
新建虚拟机的图 点击窗口-----控制中心--再点击控制中心的+号
- windows版mysql8.0安装详解
2018年07月04日 13:37:40 Zn昕 阅读数 6433更多 分类专栏: mysql 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. ...
- Django的学习——全局的static和templates的使用
一.问题 首先我们在进行Django框架搭建的时候我们需要建立一个全局的变量,一是为了实现代码的复用,二是为了方便管理,如下图的样式 二.解决 1.修改setting里面的配置文件①templates ...
- 图解微信小程序---scroll_view实现首页排行榜布局
图解微信小程序---scroll_view实现首页排行榜布局 什么是scroll-view? 滚动视图可滚动视图区域.使用竖向滚动时,需要给scroll-view一个固定高度,通过 WXSS 设置 h ...
- 大数据基础总结---HDFS分布式文件系统
HDFS分布式文件系统 文件系统的基本概述 文件系统定义:文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易. 文件名:在文件系统中,文件名是用于定位存储位置. 元数据(Metad ...
- dotnet中文字符工具类
支持繁体简体互换. using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...
- Java Automic包下的AtomicInteger
感谢这两位博主的文章,文章源于: https://www.cnblogs.com/chenpi/p/5375805.html https://blog.csdn.net/fanrenxiang/art ...
- layui 日期插件一闪而过
关于一个layui插件日期的问题,在本地调试都是可以的,但发布到服务器上的时候,日期插件一闪而过,后来我以为是各个插件之间的冲突,我就每个插件的排除,但是还是无动于衷,然后我就去官网看了下是,需要加一 ...