文章目录
关于 自定义JS工具类 相关类似的源码请看 https://gitee.com/ykang2020/my_utils
1. 自定义new
创建Fn构造函数的实例对象
定义
/**
* 自定义new
* 创建Fn构造函数的实例对象
* @param {Function} Fn
* @param {...any} args
* @returns
*/
export default function newInstance(Fn, ...args) {
// 1. 创建新对象
// 创建空的object实例对象,作为Fn的实例对象
const obj = {
};
// 修改新对象的原型对象
// 将Fn的prototype(显式原型)属性赋值给obj的__proto__(隐式原型)属性
obj.__proto__ = Fn.prototype;
// 2. 修改函数内部this指向新对象,并执行
//
const result = Fn.call(obj, ...args);
// 3. 返回新对象
// return obj
// 与new保持一直,如果构造函数有返回值,返回值是对象a就返回对象a,否则返回实例对象
return result instanceof Object ? result : obj;
}
使用
import newInstance from "./object/newInstance";
function Person(name, age) {
this.name = name;
this.age = age;
}
const p = new Person("YK", 18);
console.log(p);
console.log(p.constructor);
console.log('************');
const p2 = newInstance(Person, "YK菌", 19);
console.log(p2);
console.log(p2.constructor);
console.log('************');
function Person2(name, age) {
this.name = name;
this.age = age;
return {
a: 100 };
}
console.log(new Person2());
console.log(newInstance(Person2));
结果
2. 自定义instanceof
判断obj是否是Fn类型的实例对象
定义
实现方法:Fn的原型对象是否是obj的原型链上的某个对象
/**
* 自定义instanceof
* 判断obj是否是Fn类型的实例对象
* 实现方法:Fn的原型对象是否是obj的原型链上的某个对象
* @param {Object} obj
* @param {*} Fn 构造函数
* @returns
*/
export default function myInstanceOf(obj, Fn) {
// 得到obj的隐式原型对象
let protoObj = obj.__proto__;
// 原型对象存在,就遍历原型链
while (protoObj) {
// 实例对象的隐式原型 等于 构造函数的显式原型 就返回true
if (protoObj === Fn.prototype) {
return true;
}
// 不相等就根据原型链一直往上找 直到最后为null
protoObj = protoObj.__proto__;
}
return false;
}
使用
import myInstanceOf from "./object/myInstanceOf";
function Person(name, age) {
this.name = name;
this.age = age;
}
const p = new Person("YK", 18);
console.log(myInstanceOf(p, Object), p instanceof Object);
console.log(myInstanceOf(p, Person), p instanceof Person);
console.log(myInstanceOf(p, Function), p instanceof