我对javascript的“新”运算符感到困惑。我怎么知道“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 {} 。 据我所知,我们无法实现“新”所具有的相同行为?
答案 0 :(得分:2)
使用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 {}
答案 1 :(得分:0)
这是A
类型的新对象,未命名为A
。
答案 2 :(得分:0)
New运算符基本上与构造函数一起用于创建实例。
这是新运营商的基本要求:
1)创建一个Object函数实例
2)用创建的对象调用构造函数,(构造函数中的这个对象只是新操作符对创建对象的引用)
3)返回创建的对象。
以下例如是给你实现它的想法。
function f() {
this.name = "hello";
}
f.prototype = {
getName : function() {
return this.name;
}
}
function instance(func) {
var obj = new Object;
func.call(obj);
obj.__proto__ = f.prototype;
return obj;
}
a = instance(f);
使用new运算符的好处是可以使用instanceOf运算符在运行时内省对象类型。
a instanceOf Object -> true
a instanceOf f -> true