我想知道这句话是否正确?
你可以做:
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。关键字告诉 JavaScript 解释器new返回一个对象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();