JavaScript中new实现原理
function Parent(age, name) {
this.age = age
this.name = name
this.sayAge = function() {
console.log('this.age :', this.age)
}
}
Parent.prototype.sayName = function() {
console.log('this.name :', this.name)
}
function New(Fn) {
let obj = {}
let arg = Array.prototype.slice.call(arguments, 1)
obj.__proto__ = Fn.prototype
obj.__proto__.constructor = Fn
Fn.apply(obj, arg)
return obj
}
let son = new Parent(18, 'lining')
let newSon = New(Parent, 18, 'lining') console.log('son :', son) // son : Parent { age: 18, name: 'lining', sayAge: [Function] }
console.log('newSon :', newSon) // newSon : Parent { age: 18, name: 'lining', sayAge: [Function] } console.log('son.constructor :', son.constructor)
// son.constructor : function Parent(age, name) {
// this.age = age
// this.name = name
// this.sayAge = function() {
// console.log('this.age :', this.age)
// }
// } console.log('newSon.constructor :', newSon.constructor)
// newSon.constructor : function Parent(age, name) {
// this.age = age
// this.name = name
// this.sayAge = function() {
// console.log('this.age :', this.age)
// }
// }
function Parent(age, name) {
this.age = age
this.name = name
this.sayAge = function() {
console.log('this.age :', this.age)
}
// return 0
// return null
// return undefined
// return false
// return true
// return ''
// return 'parent'
// return Symbol('parent')
// return []
// return {}
// return {
// hands: 2,
// foot: 2
// }
}
Parent.prototype.sayName = function() {
console.log('this.name :', this.name)
}
return 0:
let p1 = new Parent(18, 'jolin')
console.log('p1 :', p1) // p1 : Parent { age: 18, name: 'jolin', sayAge: [Function] } return null:
let p2 = new Parent(18, 'jolin')
console.log('p2 :', p2) // p2 : Parent { age: 18, name: 'jolin', sayAge: [Function] } return undefined:
let p3 = new Parent(18, 'jolin')
console.log('p3 :', p3) // p3 : Parent { age: 18, name: 'jolin', sayAge: [Function] } return false:
let p4 = new Parent(18, 'jolin')
console.log('p4 :', p4) // p4 : Parent { age: 18, name: 'jolin', sayAge: [Function] } return true:
let p5 = new Parent(18, 'jolin')
console.log('p5 :', p5) // p5 : Parent { age: 18, name: 'jolin', sayAge: [Function] } return '':
let p6 = new Parent(18, 'jolin')
console.log('p6 :', p6) // p6 : Parent { age: 18, name: 'jolin', sayAge: [Function] } return 'parent':
let p7 = new Parent(18, 'jolin')
console.log('p7 :', p7) // p7 : Parent { age: 18, name: 'jolin', sayAge: [Function] } return Symbol('parent'):
let p8 = new Parent(18, 'jolin')
console.log('p8 :', p8) // p8 : Parent { age: 18, name: 'jolin', sayAge: [Function] } return []:
let p9 = new Parent(18, 'jolin')
console.log('p9 :', p9) // p9 : [] return {}:
let p10 = new Parent(18, 'jolin')
console.log('p10 :', p10) // p10 : {} return {
hands: 2,
foot: 2
}
let p11 = new Parent(18, 'jolin')
console.log('p11 :', p11) // p11 : { hands: 2, foot: 2 }
修改模拟 new 运算符功能函数
function New(Fn) {
let obj = {}
let arg = Array.prototype.slice.call(arguments, 1)
obj.__proto__ = Fn.prototype
obj.__proto__.constructor = Fn
let ret = Fn.apply(obj, arg)
return typeof ret === 'object' ? ret || obj : obj
}
JavaScript中new实现原理的更多相关文章
- JavaScript中的计时器原理
理解John Resig 在 How JavaScript Timers Work. 原理分析 timer(setInterval,setTimeout)有一个很重要的概念,时间延迟的长短是不稳定的. ...
- JavaScript 中 this 的原理
一.问题 学习 JavaScript 其中一个标志就是理解下面两种写法,会输出有不一样的结果. var obj = { foo: function () {} }; var foo = obj.foo ...
- javaScript中的闭包原理 (译)
这篇文章通过javaScript代码解释了闭包的原理,来让编程人员理解闭包.它不是写给大牛或使用功能性语言进行编程的程序员的.一旦意会了其核心概念,闭包理解起来并不难.然而,你不可能通过阅读任何有关闭 ...
- 剖析Javascript中forEach()底层原理,如何重写forEach()
我们平时用的forEach()一般是这样用的 var myArr = [1,5,8] myArr.forEach((v,i)=>{ console.log(v,i) })//运行后是这样的1 0 ...
- JavaScript中this对象原理简洁说明
今天看了阮一峰大神的博客文章:JavaScript 的this原理,把纠结很久的this的指向终于理解清楚了 原文:http://www.ruanyifeng.com/blog/2018/06/jav ...
- JavaScript中的继承(原型链)
一.原型链 ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 实例1: function SupType() { this.pro ...
- 领悟 JavaScript 中的面向对象
JavaScript是基于对象的语言,我们可以使用面向对象的思想去开发js代码. JavaScript是基于对象的语言. 可以使用面向对象的思想,但是不少人对这一点理解得并不全面. 在 JavaScr ...
- JavaScript中this的工作原理以及注意事项
在JavaScript中,this 的概念比较复杂.除了在面向对象编程中,this 还是随处可用的.这篇文章介绍了this 的工作原理,它会造成什么样的问题以及this 的相关例子. 要根据this ...
- 原生JavaScript中动画与特效的实现原理
现如今,许多页面上均有一些动画效果.适当的动画效果可以在一定程度上提高页面的美观度,具有提示效果的动画可以增强页面的易用性. 实现页面动画的途径一般有两种. 一种是通过操作JavaScript间接操作 ...
随机推荐
- Django之路由分发和反向解析
一.路由分发: 路由分发是指:总路由不再直接做路由与视图函数的对应关系,而是将获取的路由分发给下面的app去处理对应关系 from django.conf.urls import url,includ ...
- cesium 之地图显示坐标、比例尺、海拔高度效果篇(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- Android 报错:error: too many padding sections on bottom border
一.发生错误 [我以为我做了一张完美的.9图片,没想到.9图片还需要画左边和上边,尴尬···] 二.解决方法 .9图片造成错误 [具体内容] 最后修改.9图为
- Android视频录制从不入门到入门系列教程(三)————视频方向
运行Android视频录制从不入门到入门系列教程(二)————显示视频图像中的Demo后,我们应该能发现视频的方向是错误的. 由于Android中,Camera给我们的视频图片的原始方向是下图这个样子 ...
- 『cURL』curl: (6) Could not resolve host无法解析主机地址
最近在学数据挖掘时,获取数据有两种途径: 开放数据,可以直接使用和存储的数据: 网络数据,通过爬虫或云市场api(付费或免费)获取数据 我通过教程,在阿里云购买一个天气数据api,尝试使用cURL获取 ...
- mysqlbinlog 工具分析binlog日志
MySQL的binlog 日志对于生产环境非常有用,任何时间对数据库的修改都会记录在binglog中:当数据发生增删改,创建数据库对象都会记录到binlog中,数据库的复制也是基于binlog进行同步 ...
- Docker-Linux环境安装
不同服务器操作系统安装命令不同,例如centOS默认用yum,Ubuntu可能默认用apt-get.这里推荐一种安装方式,通过下载shell脚本 https://get.docker.com,会检测操 ...
- mysql(mariadb)主从配置
环境: 内核版本:uname -r 系统版本:cat /etc/redhat-release
- php连接数据库,以及日期处理函数
php连接数据库,以及日期处理函数 $conn=mysql_connect("10.0.10.0:0000","root","123456" ...
- svn上传*.so文件
做移动开发,android里面需要用到第三方类库,设计"*.so"文件. svn无法提交,Eclipse里面的svn视图里面该文档无版本图标. 原因描述:svn忽略某些扩展名的文件 ...