博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
玩转js之——new方法的模拟实现
阅读量:7061 次
发布时间:2019-06-28

本文共 1730 字,大约阅读时间需要 5 分钟。

hot3.png

已知new的作用 1.实例可以访问到构造函数的属性和方法 2.实例可以访问到构造函数原型中的属性和方法

//demo:function Person(name, age) {  this.name = name  this.age = age}Person.prototype.sayName = function () {  console.log("this.name:",this.name)}const man = new Person("张三",18)console.log("demo man:", man) //Person { name: '张三', age: 18 }man.sayName() //this.name: 张三

初步实现

function myNew() {    const result = new Object() //最终返回的是个对象,所以先new一个出来    const obj = Array.prototype.shift.call(arguments) //使用shift,截取第一个参数,即我们需要的构造函数    //这一步其实可以不用,因为shift直接改变原数组,在后面的apply的时候直接传arguments即可    const argArray = Array.prototype.slice.call(arguments)//将构造函数obj的this指向result对象,这样result就可以访问到obj中的属性或方法    result.__proto__ = obj.prototype // 第二条,继承原型上的属性或方法    obj.apply(result, argArray) //第一条,将构造函数obj的this指向result对象,这样result就可以访问到obj中的属性或方法    return result}const b = myNew(Person, "张三",19)console.log("test:", b) //test: { name: '张三', age: 19 }

完美实现,(^▽^) 哈哈哈。。。。

第二步 优化

如果构造函数有返回且返回的是个指定对象呢,比如

function Person(name, age) {  this.name = name  this.age = age  this.like = "休息"  return {    like:this.like  }}const man = new Person("张三", 18)console.log("demo man:", man) //demo man: { like: '休息' }console.log(man.name, man.age) //undefined undefined

代码实现

function myNew() {  、、、、  、、、、  const  hasReturn = obj.apply(result,argArray)  //第一条,将构造函数obj的this指向result对象,这样result就可以访问到obj中的属性或方法                                                 //同时看obj构造函数有无返回,且,返回是否为对象,否则,直接返回  return typeof hasReturn === 'object' ? hasReturn : result}const b = myNew(Person, "张三", 19)console.log("test:", b) // test: { like: '休息' }console.log(b.name, b.age) // undefined undefined

完成,(^-^)V

tips:如果构造函数没有返回或者返回的不是一个指定对象,比如只是 return "哈哈哈" 这种,那返回不返回其实没啥区别

转载于:https://my.oschina.net/u/3607067/blog/2209082

你可能感兴趣的文章
Sublime Text 2的快速入门和常用技巧
查看>>
什么是关系型数据库?
查看>>
数据结构实验之栈一:进制转换
查看>>
Linux软件包安装与卸载
查看>>
浏览器各种尺寸获取
查看>>
博客云第二周作业
查看>>
凸包——Graham扫描法和Andrew算法
查看>>
POJ 2486 Apple Tree ——(树型DP)
查看>>
BZOJ 2938 [Poi2000]病毒
查看>>
URL详解
查看>>
canvas元素简易教程(4)(大部分转自火狐,自己只写了简单的代码分析)
查看>>
Sqlserver2014 Master....提示异常,IIS未安装
查看>>
树链剖分
查看>>
2015 多校联赛 ——HDU5353(构造)
查看>>
hdu1698 线段树区间更新
查看>>
hdu 3518 后缀数组
查看>>
插入迭代器
查看>>
Callback函数详解
查看>>
leetcode 168. Excel Sheet Column Title
查看>>
sybase数据库删除报的存储过程错
查看>>