JavaScript常见面试题之手写new

先上代码

function myNew(fn, args) {
    let object = {};
    object.__proto__ = fn.prototype;
    let res = fn.apply(object, args);
    return res instanceof Object ? res : object;
}

先对其进行测试然后再分析

编写一个构造函数

function Student(name) {
    this.name = name;
}
Student.prototype.sayHello = function () {
    console.log("I am " + this.name);
}

进行new操作

let Tom = myNew(Student, ['Tom']);
Tom.sayHello();

控制台输出:

在这里插入图片描述

分析

1 创建一个新对象

function myNew(fn, args) {
    let object = new Object(); // 每次调用 myNew 都先创建一个新的对象
    ...
    ...
    ...

2 构造原型链(以后会写一篇讲解原型链的文章)

function myNew(fn, args) {
    let object = new Object();
    object.__proto__ = fn.prototype; // 使 object 的 __proto__ 指向构造函数的 prototype 对象
    ...
    ...
    ...

3 使用 apply 绑定 this

关于apply和call的知识:JS中的call()方法和apply()方法用法总结

function myNew(fn, args) {
    let object = new Object();
    object.__proto__ = fn.prototype;
    let res = fn.apply(object, args); // 绑定 this
    ...
    ...
    ...

4 如果 res 处于 Object 的原型链上,返回 res,否则返回 object

function myNew(fn, args) {
    let object = new Object();
    object.__proto__ = fn.prototype;
    let res = fn.apply(object, args);
    return res instanceof Object ? res : object;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值