【问题标题】:Type of "this" object within "new" operator“new”运算符中“this”对象的类型
【发布时间】:2014-04-25 07:31:30
【问题描述】:

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

将记录 Object {} 而不是 A {}。 据我了解,我们无法实现与“新”相同的行为?

【问题讨论】:

  • 那么实际的问题是什么?我没听懂。
  • 也许new Operator 会阐明它是如何工作的?
  • 问题是什么。你能显示完整的代码吗?
  • @Teemu 这不是向某人介绍它的最简单方法。 MDN's article 可能更清楚。
  • @winner_joiner,我更新了问题

标签: javascript object


【解决方案1】:

当您使用 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 {}

【讨论】:

  • 谢谢!现在很清楚了。 Chrome 的控制台很聪明)在 Firefox 中尝试过,它得到了“新”的“对象”,就像我相信的那样
【解决方案2】:

这是一个 A 类型的新对象,未命名为 A

【讨论】:

    【解决方案3】:

    New 操作符基本上是和构造函数一起使用来创建实例的。

    这就是 new 操作符本质上所做的:

    1) 创建 Object 函数的实例

    2) 用创建的对象调用构造函数,(构造函数中的这个对象只不过是通过new操作符对创建的对象的引用)

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-16
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多