1. 新しいオペレーターは何をするのですか?
プログラミングの過程では new 演算子が頻繁に使用されるため、new メソッドを手動で作成する場合は、その機能を理解しておく必要があります。その機能は次の点に分けられます。
1. 新しい空のオブジェクトを作成します
2. この新しい空のオブジェクトの隠者プロトタイプ (__proto__) をコンストラクターのプロトタイプ オブジェクト (prototype) にポイントします。
3. コンストラクターで this を新しく作成した空のオブジェクトにポイントし、コンストラクターを実行して実行結果を返します。
4. 返された実行結果が参照型であるかどうかを判断し、参照型である場合は実行結果を返し、新しい操作は失敗します。そうでない場合は、作成された新しいオブジェクトを返します。
2. 新しいメソッドを実装する
新しい演算子の機能がわかったので、次の点に従ってその機能を実装し、コードを直接追加できます。
function myNew(Fn,...args){
// 1、创建一个空的对象
let obj = {}; // let obj = Object.create({});
// 2、将空对象的原型prototype指向构造函数的原型
Object.setPrototypeOf(obj,Fn.prototype); // obj.__proto__ = Fn.prototype
// 以上 1、2步还可以通过 const obj = Object.create(Fn.prototype) 实现
// 3、改变构造函数的上下文(this),并将参数传入
let result = Fn.apply(obj,args);
// 4、如果构造函数执行后,返回的结果是对象类型,则直接将该结果返回,否则返回 obj 对象
return result instanceof Object ? result : obj;
// return typeof result === 'object' && result != null ? result : obj
}