問題 組み込みのnewリファクタリング
function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function () {
console.log('wangwang');
}
Dog.prototype.sayName = function () {
console.log('my name is ' + this.name);
}
/*
let sanmao = new Dog(' ');
sanmao.sayName();
sanmao.bark();
function _new() {
//=>完成したコード
}
let sanmao = _new(Dog, ' ');
sanmao.bark(); //=>"wangwang"
sanmao.sayName(); //=>"my name is "
console.log(sanmao instanceof Dog); //=>true
組み込みのnewキーワードに基づいて、プロトタイプのプロパティやメソッドを呼び出すことができるDogのインスタンスsanmaoを作成することができます。
function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function () {
console.log('wangwang');
}
Dog.prototype.sayName = function () {
console.log('my name is ' + this.name);
}
/*
* _newそして、組み込みのnewの結果をシミュレートするために、_newメソッドを自分で実装する必要がある。
* @params
* Fn:インスタンスを作成したいクラスを渡す。
* 後続のパラメータは固定数ではなく、渡された値が現在のクラスの実行に与えられる。
* @return
* Fnこのクラスのインスタンス
*/
function _new(Fn) {
// 渡された実パラメータ情報の処理:Fnに渡された値以外のすべての値を取得する。
let args = Array.from(arguments).slice(1);
// インスタンス・オブジェクトOBJを作成する
let obj = Object.create(Fn.prototype);
// Fn関数を実行する際には、FnのTHISがインスタンス・オブジェクトOBJを指すようにする必要がある。
let result = Fn.apply(obj, args);
// 生成されたインスタンスオブジェクトを返す
if (result !== null && (typeof result === "object"
typeof result === "function")) {
return result;
}
return obj;
}
let sanmao = _new(Dog, ' ', , 300);
sanmao.bark(); //=>"wangwang"
sanmao.sayName(); //=>"my name is "
console.log(sanmao instanceof Dog); //=>true
// sanmao = new Dog(' ');
// 最初のステップは、Dogを通常の関数として実行することだ。
// 特別1:オブジェクトを作る
// 特殊2:そして、関数内のTHISは作成されたオブジェクトを指すようにする。
// 特殊3:結果を返さない関数や基本データ値を返す関数の場合は、作成したインスタンスオブジェクトを返す。
/* let obj = {};
obj.__proto__ = Fn.prototype; //=>IEこれは__proto__ */
/*
// =>Object.create
let xxx = {name:' '};
let obj = Object.create(xxx);
空のオブジェクトを作り、xxxをそのプロトタイプとする。
*/