JS手动实现一个new操作

作者: 哎呦_連啓 | 来源:发表于2019-06-13 13:35 被阅读2次

要手动实现一个 new 操作符,首先要知道 new 操作符都做了什么事,即构造函数的内部原理:
1.创建一个新对象;
2.链接到原型(将构造函数的 prototype 赋值给新对象的 __proto__);
3.绑定this(构造函数中的this指向新对象并且调用构造函数)
4.返回新对象
这样我们就可以手动实现一个 new 方法了

function realizeNew () {
    //创建一个新对象
    let obj  = {};
    //获得构造函数
    let Con = [].shift.call(arguments);
    //链接到原型(给obj这个新生对象的原型指向它的构造函数的原型)
    obj.__proto__ = Con.prototype;
    //绑定this
    let result = Con.apply(obj,arguments);
    //确保new出来的是一个对象
    return typeof result === "object" ? result : obj
}

我们实现的 realizeNew() 方法需要传入的参数是:构造函数 + 属性

首先我们创建一个新对象,

然后通过 arguments 类数组我们可以知道参数中包含了构造函数以及我们调用create时传入的其他参数,接下来就是要想如何得到其中这个构造函数和其他的参数,由于arguments是类数组,没有直接的方法可以供其使用,我们可以有以下两种方法:
1.Array.from(arguments).shift(); 转换成数组 使用数组的方法 shift 将第一项弹出
2.[].shift().call(arguments) ; 通过 call()arguments能够借用shift()方法

绑定this的时候需要注意:
1.给构造函数传入属性,注意构造函数的this属性
2.参数传进 Conobj 的属性赋值,this要指向 obj 对象
3.在 Con 内部手动指定函数执行时的this 使用call、apply实现

最后我们需要返回一个对象

我们来测试一下:

function Person (name,age){
    this.name = name;
    this.age = age;
    this.say = function () {
        console.log("I am " + this.name)
    }
}

//通过new创建构造实例
let person1 = new Person("Curry",18);
console.log(person1.name);      //"Curry"
console.log(person1.age);       //18
person1.say();      //"I am Curry'

//通过realize()方法创造实例
let person2 = realizeNew (Person,"Curry",18);
console.log(person2.name);      //"Curry"
console.log(person2.age);       //18
person2.say();      //"I am Curry'

相关文章

  • JS手动实现一个new操作

    要手动实现一个 new 操作符,首先要知道 new 操作符都做了什么事,即构造函数的内部原理:1.创建一个新对象;...

  • js手动实现new

    1,创建一个空对象2,链接到构造函数的原型3,绑定this到该对象4,返回新对象 使用Object.create简化写法

  • 手动实现一个new操作

    写在前面 在所有的前端面试中常常喜欢考面试者如何手写一个new操作符,作为在准备秋招的大三党,我也要考虑这些。那么...

  • js手动实现new方法

    要自己实现一个new功能,实现要知道new操作符都干了些什么,其实总的来说就四步:1.创建一个空对象2.链接到原型...

  • new操作符

    最近在掘金上看到大佬 yck 的文章 重学 JS 系列:聊聊 new 操作符把new操作符的作用,如何自己实现ne...

  • 手动实现一个new

    先说说new是做什么,怎么用的?看代码,我们一一解释 1、首先构造函数是一个对象,证明new 返回一个对象,根据我...

  • 面试官问:能否模拟实现JS的call和apply方法

    之前写过两篇《面试官问:能否模拟实现JS的new操作符》和《面试官问:能否模拟实现JS的bind方法》 其中模拟b...

  • new

    什么是new操作符 new会生成一个实例对象,该对象的this指向该实例 实现一个new操作符

  • 模拟实现 new 操作符(js)

    title: 模拟实现 new 操作符date: 2019/10/22 21:30:25categories: 面...

  • js模拟实现new操作符

    以下例子模拟

网友评论

    本文标题:JS手动实现一个new操作

    本文链接:https://www.haomeiwen.com/subject/hdrdfctx.html