2

この文章が正しいか知りたいですか?

できるよ:

var a = new A();

の場合に限りAますinstanceof Function

関数のインスタンスを作成するだけで、関数がオブジェクトであることがわかります。他のユーザー定義オブジェクトのインスタンスを作成できないのはなぜですか?このような:

var b={};
var c = new b();  //error

b編集:そのインスタンスを作成できるように変更するにはどうすればよいですか?

4

4 に答える 4

4

実際にはObject.create()、ECMAscript のプロトタイプの性質に多少の加減を加えることができます。お気に入り

var b = { };
var c = Object.create( b );

これで、c はbそのプロトタイプ チェーンを保持します。ECMAscript またはより正確には、プロトタイプの継承は、「従来の継承」とまったく同じようには機能しません。関数を呼び出すnewときに呼び出すことで、実際に新しく作成されたオブジェクトも受け取ります。thisそのように呼び出されたコンストラクター関数内の値を介して、そのオブジェクトを変更およびアクセスできます。

ただし、これまで何も継承していません。.prototypeインスタンスを作成する前に、コンストラクター関数の - オブジェクトを作成して埋める必要があります。このパターンは多くの人を悩ませたので、ES5 は を使用して他のオブジェクトから直接継承するより便利な方法を導入しましたObject.create()

于 2012-08-30T22:58:38.847 に答える
4

関数のインスタンスを作成するだけで、関数がオブジェクトであることがわかります。他のユーザー定義オブジェクトのインスタンスを作成できないのはなぜですか?

「関数のインスタンスを作成できる」というのは正確ではありません。このnewキーワードは少し誤解を招きます。JavaScript がクラスを使用してオブジェクト指向を実装しているように見えますが、実際にはそうではありません。

実際に行っているnew A()のは、コンストラクター関数を使用してオブジェクトを作成することですA。このnewキーワードは、JavaScript インタープリターにオブジェクトを返すように指示します。A具体的には、this内部で参照されるオブジェクトですA

b編集:そのインスタンスを作成できるように変更するにはどうすればよいですか?

あなたの例でbは、オブジェクト(var b={};)です。コンストラクタ関数に変更bすると、それを使用してオブジェクトを作成できます。(慣例により、JavaScript のコンストラクター関数は大文字で始まります。)

そう:

function B () {
}

var c = new B();

prototypeのオブジェクトに何かを追加することができ、それらは(および を使用して作成した他のオブジェクトにも)Bアクセスできます。cB

function B () {
}

B.prototype.NAME = 'B';

B.prototype.hello = function () {
    alert('Hello!');
}

var c = new B();
c.NAME // 'B'
c.hello() // alerts 'Hello!'
于 2012-08-30T23:04:23.960 に答える
3

簡単な答え: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).
于 2012-08-30T23:01:07.650 に答える
1

あなたもできる

var b = new a.constructor();
于 2012-08-30T22:59:27.667 に答える