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 ...
随机推荐
- Eureka概述
1:Eureka是什么 Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以及·实现云端中间层服务发现和故障转移 ...
- IDEA 2019注册码(2020年4月过期)
IDEA 2019注册码(2020年4月过期) 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mII ...
- scala练习题--万年历
使用方法去完成 import scala.io.StdIn object work1 { def main(args: Array[String]): Unit = { // 1.先输出提示语句,并 ...
- java报错 pom.xml第一行报"org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project...
https://www.cnblogs.com/appium/p/11168441.html 新建Maven项目时,每个pom文件第一行都报错. 一.问题分析 原因就是你的maven的配置文件不是最新 ...
- C# 文件监听类 FileSystemWatcher 属性
属性: Path——这个属性告诉FileSystemWatcher它需要监控哪条路径.例如,如果我们将这个属性设为“C:Temp”,对象就监控那个目录发生的所有改变.IncludeSubDirecto ...
- GitHub 上受欢迎的 Android UI Library整理
https://github.com/Tapadoo/Alerter ★2528 - 克服Toast和Snackbar的限制 https://github.com/wenmingvs/NotifyUt ...
- JavaScript学习思维导图
JS基本概念 JS操作符 JS基本语法 JS数组 JS Date用法 JS 字符串用法 JS编程风格 JS实践
- Vue定义组件和生命周期函数及实例演示!
定义全局组件 Vue.component("name",{...}) 定义局部组件 let Com = {....} new Vue({ data : ..., ..., comp ...
- SUCTF 2018——Anonymous(php匿名函数 \x00lambda_)
题目地址:http://45.76.173.177:23334/ <?php $MY = create_function("","die(`cat flag.php ...
- c# 开发+MySql数据库
今天就一个客户端的任务:1.把Excel文件转成特定格式插入到数据库中:2.查出该文件,并且导出Excel文件:3.如果插入数据错误,则把刚插入的数据删除掉.感觉比较简单,可是,墨迹了一天呀....总 ...