// 假设你在学习之前了解 js面向对象
function Student(name){
this.name = name;
}
const stu = new Student("Tom");
// 当我们通过构造函数 new 一个实例时都做了什么?
1. 创建一个新对象
2. 将新对象的 __proto__ 指向构造函数的 prototype //(所以实例可以使用构造函数上的属性和方法)
3. 将构造函数的 this 指向这个新对象
4. 返回新对象
// 所以根据四个步骤我们可以仿写一个 new
function _new(fn, ...props){
// 创建一个新对象
const obj = {};
// 将新对象的 __proto__ 指向构造函数的 prototype
Object.setPrototypeOf(obj, fn.prototype); // 相当于 obj.__proto__ = fn.prototype, 但是不建议直接使用__proto__
// 将构造函数的 this 指向这个新对象
const newObj = fn.apply(obj, props);
// 返回这个新对象
return newObj === 'object' ? newObj : obj
}
const stu1 = _new(Student, "Tom")
// 可以打印一下 stu 和 stu1 效果一样, 而且 Object.getPrototypeOf(stu) === Object.getPrototypeOf(stu1) 为 true;
// Object.getPrototypeOf(stu) 相当于 stu.__ptoto__
js new做了什么,怎么去仿写new
最新推荐文章于 2022-05-20 01:14:45 发布