【引き裂く原理】面接官:さあ、newオペレータを実現
newオペレータの具体的な実装手順を実装します.まず関数は不定量のパラメータを受け入れ、最初のパラメータは構造関数であり、次のパラメータは構造関数によって を用いる.その後、内部に空のオブジェクトobj が作成される. objオブジェクトは、コンストラクション関数プロトタイプチェーンのプロパティにアクセスする必要があるため、setPrototypeOfを介して両者を関連付けます.このコードはobjに等しい.proto = Con.prototype はobjを構造関数にバインドし、残りのパラメータ に伝達する.は、コンストラクション関数の戻り値がオブジェクトであるか否かを判断し、オブジェクトである場合にはコンストラクション関数の戻り値を使用する、そうでない場合にはobjを使用することで、コンストラクション関数の戻り値を無視する を実現する.
注意:
一、newオペレータのいくつかの役割: newオペレータはオブジェクトを返します.したがって、内部にオブジェクト を作成する必要があります.このオブジェクト、すなわち構造関数のthisは、thisにマウントされた任意の属性 にアクセスできます.このオブジェクトは、コンストラクション関数のプロトタイプチェーンのプロパティにアクセスできるため、オブジェクトをコンストラクション関数にリンクする必要がある .元の値を返すには無視が必要であり、オブジェクトを返すには正常な処理が必要である 二、newオペレータの特徴: newコンストラクション関数Test作成処理のインスタンスは、コンストラクション関数のプロパティにアクセスすることも、コンストラクション関数のプロトタイプチェーンのプロパティにアクセスすることもできるので、newオペレータによってインスタンスとコンストラクション関数がプロトタイプチェーンを介して接続される .コンストラクタ元の値を返すと、この戻り値は意味がありません .コンストラクション関数オブジェクトを返すと、この戻り値は正常に使用され、newオペレータが を機能しない.
/**
* new
* @param {*} Con
* @param {...any} args
*/
function createNew(con,...args){
let obj = {}; // , new
obj.__proto__ = con.prototype; //
let res = con.apply(obj,args); // this ,
if(res instanceof Object){ //
return res;
}else{
return obj;
}
}
function foo(name, age) {
this.name = name;
this.age = age;
//console.log(this); // this
}
var f = createNew(foo,'Chocolate',18);
console.log(f);
注意:
一、newオペレータのいくつかの役割:
,