我对 javascript 的“new”运算符有点困惑。我怎么知道“new SomeClass()”有这样的行为:
_instance = {};
_instance.__proto__ = SomeClass.prototype;
return SomeClass.apply(_instance, arguments) || _instance;
作为返回,我们有“SomeClass {}”,即 SomeClass 的实例。 但如果我想看看构造函数中的“this”是什么:
A = function(){ console.log(this); };
new A;
我在输出中看到A {}。 那么,“new”运算符如何创建 _instance 空对象,使其已经是 A 类型的对象?
<小时/>var A = function(){ console.log(this); };
var _instance = {}
_instance.__proto__ = A.prototype;
A.apply(_instance) || _instance;
将记录对象{}而不是A{}。 据我了解,我们无法实现与"new"相同的行为?
最佳答案
当您使用 new 关键字创建新的 JavaScript 对象时,JavaScript 会添加一个名为 constructor
的属性,其中包含一个 name
属性:
var a = new A();
console.log(a.constructor===A);//true
您在控制台中实际看到的名称只是该函数的名称属性:
console.log(a.constructor.name);//"A"
而当您创建一个文字对象时,例如:
var _instance = {};
构造函数是 JavaScript Object
类:
console.log(_instance.constructor===Object);//true
console.log(_instance.constructor.name);//"Object"
另一点是,无论您使用哪种方式创建对象,您始终可以像这样检查它:
_instance instanceof _instance.constructor
另一点与 JavaScript 控制台通常所做的一些额外的魔法有关。例如在 Chrome 中,即使该函数是无名函数,例如:
var A = function/*function name should be here*/(){};
//you can check it like:
console.log(A.name);//""
Chrome 会检查该对象的名称,如果它是空字符串,则会使用函数的变量名称而不是 constructor.name
。
如果该函数没有变量,会发生什么,就像您创建对象时一样:
var obj=new (function(){});
//output is Object {}
然后,由于没有为该函数创建变量,并且它没有任何名称,因此 console
除了使用 Object
作为该名称之外别无选择输出,而如果你将其命名为:
var obj=new (function FunctionName(){});
//console output is FunctionName {}
它使用函数的名称并输出它,如下所示:FunctionName {}
关于javascript - "this"运算符内 "new"对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23286841/