我想知道这句话是否正确?
你可以做:
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();