基本使用
function Test(name) {
this.name = name;
return 1;
}
const t = new Test('yck');
console.log(t.name); // 'yck'
自己实现
new 返回了一个对象,然后我们通过这个对象可以访问到 原型的任意属性
function Test(name) {
this.name = name;
}
Test.prototype.sayName = function () {
console.log(this.name);
};
// const t = new Test('yck');
const t = createNew(Test, 'yck');
console.log(t.name);
t.sayName();
function createNew(fn, ...args) {
let obj = {};
// 把 fn 的原型复制到 obj上
Object.setPrototypeOf(obj, fn.prototype);
// 把obj绑定到构造函数上,传入参数
let res = fn.bind(obj)(...args);
// let res = fn.call(obj, ...args);
// let res = fn.apply(obj, args);
console.log(res);
// 判断构造函数返回值是否为对象,如果为对象就使用构造函数返回的值,否则使用 obj,这样就实现了忽略构造函数返回的原始值
return res instanceof Object ? res : obj;
}