类型"这个" " new"操作者

时间:2014-04-25 07:31:30

标签: javascript object

我对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 {} 。 据我所知,我们无法实现“新”所具有的相同行为?

3 个答案:

答案 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