javascript - "this"运算符内 "new"对象的类型

标签 javascript object

我对 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/

相关文章:

php - 是否可以使用 ajax/jquery 技术预加载页面内容?

javascript - 用 Perl 编写多行 Javascript 字符串

javascript - 在 MVC razor View 中使用浏览器的后退按钮后清除表单元素

javascript - 如何从 jquery 回调中调用对象方法

php - 打印包含在数组键中的值和打印包含在对象属性的数组键中的值有什么区别?

javascript - Php 使用 JQUERY AJAX 的相似与不同

javascript - 检测输入何时聚焦于开始/结束

javascript对象文字符号深度

javascript - 依赖对象类型检查 Javascript 似乎是多余的

python - 使用python将对象 append 到列表是抛出对象内存地址而不是对象内部的数据