この文章が正しいか知りたいですか?
できるよ:
var a = new A();
の場合に限りA
ますinstanceof Function
。
関数のインスタンスを作成するだけで、関数がオブジェクトであることがわかります。他のユーザー定義オブジェクトのインスタンスを作成できないのはなぜですか?このような:
var b={};
var c = new b(); //error
b
編集:そのインスタンスを作成できるように変更するにはどうすればよいですか?
この文章が正しいか知りたいですか?
できるよ:
var a = new A();
の場合に限りA
ますinstanceof Function
。
関数のインスタンスを作成するだけで、関数がオブジェクトであることがわかります。他のユーザー定義オブジェクトのインスタンスを作成できないのはなぜですか?このような:
var b={};
var c = new b(); //error
b
編集:そのインスタンスを作成できるように変更するにはどうすればよいですか?
実際にはObject.create()
、ECMAscript のプロトタイプの性質に多少の加減を加えることができます。お気に入り
var b = { };
var c = Object.create( b );
これで、c はb
そのプロトタイプ チェーンを保持します。ECMAscript またはより正確には、プロトタイプの継承は、「従来の継承」とまったく同じようには機能しません。関数を呼び出すnew
ときに呼び出すことで、実際に新しく作成されたオブジェクトも受け取ります。this
そのように呼び出されたコンストラクター関数内の値を介して、そのオブジェクトを変更およびアクセスできます。
ただし、これまで何も継承していません。.prototype
インスタンスを作成する前に、コンストラクター関数の - オブジェクトを作成して埋める必要があります。このパターンは多くの人を悩ませたので、ES5 は を使用して他のオブジェクトから直接継承するより便利な方法を導入しましたObject.create()
。
関数のインスタンスを作成するだけで、関数がオブジェクトであることがわかります。他のユーザー定義オブジェクトのインスタンスを作成できないのはなぜですか?
「関数のインスタンスを作成できる」というのは正確ではありません。このnew
キーワードは少し誤解を招きます。JavaScript がクラスを使用してオブジェクト指向を実装しているように見えますが、実際にはそうではありません。
実際に行っているnew A()
のは、コンストラクター関数を使用してオブジェクトを作成することですA
。このnew
キーワードは、JavaScript インタープリターにオブジェクトを返すように指示します。A
具体的には、this
内部で参照されるオブジェクトですA
。
b
編集:そのインスタンスを作成できるように変更するにはどうすればよいですか?
あなたの例でb
は、オブジェクト(var b={};
)です。コンストラクタ関数に変更b
すると、それを使用してオブジェクトを作成できます。(慣例により、JavaScript のコンストラクター関数は大文字で始まります。)
そう:
function B () {
}
var c = new B();
prototype
のオブジェクトに何かを追加することができ、それらは(および を使用して作成した他のオブジェクトにも)B
アクセスできます。c
B
function B () {
}
B.prototype.NAME = 'B';
B.prototype.hello = function () {
alert('Hello!');
}
var c = new B();
c.NAME // 'B'
c.hello() // alerts 'Hello!'
簡単な答え:new
演算子は、そのオペランドが[[Construct]]
汎用オブジェクトにはない特別な内部メソッドを持つことを必要とします。
長い答え:
11.2.2 The new Operator
The production NewExpression : new NewExpression is evaluated as follows:
1. Evaluate NewExpression.
2. Call GetValue(Result(1)).
3. If Type(Result(2)) is not Object, throw a TypeError exception.
4. If Result(2) does not implement the internal [[Construct]] method, throw a TypeError exception.
5. Call the [[Construct]] method on Result(2), providing no arguments (that is, an empty list of arguments).
6. Return Result(5).
The production MemberExpression : new MemberExpression Arguments is evaluated as follows:
1. Evaluate MemberExpression.
2. Call GetValue(Result(1)).
3. Evaluate Arguments, producing an internal list of argument values (11.2.4).
4. If Type(Result(2)) is not Object, throw a TypeError exception.
5. If Result(2) does not implement the internal [[Construct]] method, throw a TypeError exception.
6. Call the [[Construct]] method on Result(2), providing the list Result(3) as the argument values.
7. Return Result(6).
あなたもできる
var b = new a.constructor();