JavaScriptのnewオペレータはどうやって自分で実現しますか?
2302 ワード
前言
構造関数
コンストラクタと一般関数は書き方には何の違いもありません.一つの関数が
new操作子
では、は、空の単純なJavaScriptオブジェクト( は、オブジェクト(すなわち、オブジェクトの構造関数を設定する)を別のオブジェクトにリンクする. は、ステップ1で新たに作成されたオブジェクトを は、関数がオブジェクトに戻っていない場合、 以上の引用はnewオペレータ-MDNからである.
第2、4歩はよく分からないかもしれませんが、ここで改めてこの4つのステップをまとめます.は、空のオブジェクト を作成する.バインディングプロトタイプ、 は、 である.は、 に戻ります.
自分でnewを実現します.
new
皆さんはきっとよく知らないと思います.独身で対象がない時はnew
個です.便利です.実例を作る時、具体的にどのような操作をしましたか?今日は分析してみます.構造関数
new
を紹介する前に、構造関数とは何かを知る必要があります.コンストラクタと一般関数は書き方には何の違いもありません.一つの関数が
new Fun()
を介して呼び出されると、コンストラクタと呼ばれ、コンストラクタの最初の文字は通常大文字です.function User(name) {
this.name = name;
}
let u = new User('leo');
ここで、User
は構造関数であり、直接User()
を呼び出すこともできるが、このようにしては、作成例の役割を果たすことができず、非厳密なモードではname
属性をwindow
に掛けることができる.new操作子
では、
new
オペレータは一体何をしましたか?例を作成できますか?new
演算子は、ユーザーが定義したオブジェクトの種類の例を作成します.または、構造関数を持つ内蔵オブジェクトの例を作成します.new
キーワードは以下のように動作します.**{}**
)を作成する.**this**
のコンテキストとする.**this**
に戻る.第2、4歩はよく分からないかもしれませんが、ここで改めてこの4つのステップをまとめます.
u = {}
u.__proto__ = User.prototype
User()
の関数を呼び出し、空のオブジェクトu
をthis
として着信した、すなわちUser.call(u)
User()
関数が自分return
のobject
タイプを実行し終わったら、この変数を返します.そうでないとthis
に戻ります.もし構造関数が基本タイプの値を返したら、影響はないですか?それともthis
自分でnewを実現します.
new
オペレータの原理を分かりました.次に私達自身でFakeNew
関数を実現します.function FakeNew() {
let obj = {};
// arguments , shift
let Constructor = [].shift.apply(arguments);
//
obj.__proto__ = Constructor.prototype;
// , obj this
let res = Constructor.apply(obj, arguments);
//
return typeof res === 'object' ? res : obj;
}
function User(name) {
this.name = name;
}
User.prototype.getName = function() {
return this.name;
}
let u = FakeNew(User, 'leo');
console.log(u);
console.log(u.getName());
対応するキーステップの注釈はコードに添付されています.これでnew
の操作が実現されました.皆さんが後でnew
を見たら、納得できると思います.