原則の新しいオペレータについて:
1、リトルレッドブックを説明します:
(1)新しいオブジェクトを作成します
(2)コンストラクタの範囲は、新しいオブジェクトを割り当てます
(3)実行コードコンストラクタ
(4)新しいオブジェクトを返します
2、MDNの解釈について:
(1)新しいオブジェクトが作成されるFoo.prototypeから継承
(2)指定されたコンストラクタがfooと呼ばれるパラメータを使用し、これは、新しく作成されたオブジェクトにバインドされています。いかなる呼び出しパラメータなし、すなわち、パラメータが指定されていない新しいフー()、Fooの新しいFooの等価
コンストラクタは、「オブジェクト」を返した場合(3)、そのオブジェクトは、全体の新しい結果が出てくる置き換えます。コンストラクタは、オブジェクトを返さない場合は、新しい結果は、オブジェクトを作成するための手順(1)出てきます
3.概要:
new演算子を使用している場合、実際には、これらの3つのことを実行します。
// 创建了一个空对象 obj,并将这个空对象的__proto__成员指向 Foo 函数对象 prototype 成员对象 var obj = {}; obj.__proto__ = Foo.prototype; // 将 Foo 函数对象的 this 指针替换成 obj,然后再调用Foo函数 Foo.call(obj);// 判断实例类型是否为对象,是则返回实例,否则返回构造函数 if (typeof obj === 'object') { return obj; } else { return Foo; }
也就是说,函数内部发生了以下变化:
(1)创建一个新对象,并继承构造函数 Foo 的原型对象 Foo.prototype
(2)构造函数 Foo 被执行,执行时传入相应的参数,并将 this 指定为新的实例
(3)判断实例是否为对象,是则返回实例,否则返回构造函数