2

我想知道这句话是否正确?

你可以做:

var a = new A();

当且仅当Ainstanceof 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。关键字告诉 JavaScript 解释器new返回一个对象A——特别是thisA.

编辑:我怎样才能改变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!'
于 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 回答