-
-
Notifications
You must be signed in to change notification settings - Fork 99
/
new.js
25 lines (25 loc) · 1.01 KB
/
new.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* eslint-disable no-underscore-dangle */
/*
* Author : OBKoro1
* Date : 2021-07-30 15:00:30
* LastEditors : OBKoro1 1677593011@qq.com
* LastEditTime : 2024-04-22 11:14:14
* FilePath : /web-basics/src/js/new/new.js
* description : new实现原理
* koroFileheader VSCode插件
* Copyright (c) 2021 by OBKoro1, All Rights Reserved.
*/
// 思路:执行函数,挂载原型、判断返回值
function myNew(fn, ...params) {
// 第一个参数为要new的构造函数 其他的为该构造函数的参数
// 挂载原型 执行结果
const target = {} // 挂载原型的对象
target._proto_ = fn.prototype // 原型连接,target是fn的实例
const res = fn.apply(target, params) // 执行函数 将this指向构造函数的实例
// 判断返回值
const type = typeof res // 结果的类型
if (res && (type === 'object' || type === 'function')) {
return res // 构造函数返回其他对象、或者函数 就返回res
}
return target // 否则就返回函数的实例
}