JavaScript新功能混乱

时间:2013-12-14 15:41:01

标签: javascript function object

在阅读Learning JavaScript第2版时,我在第13章:创建自定义JavaScript对象中看到了一段代码。

var oneOff = new Function () {
    this.variablea = "variablea";
    this.method = function () {
        return xxx;
    }
}

据说它与:

相同
var oneOff = new Object();
oneOff.variablea = "variablea";
oneOff.method = function () {...};

但我不知道新的Function(){..}是什么。任何帮助表示赞赏。感谢。

2 个答案:

答案 0 :(得分:2)

使用新函数(){/ * * /}时,您不是创建新函数,而是创建对象。
它只是带有构造函数的new的标准用法,如:

var oneInstance = new ConstructorFunction();

function ConstructorFunction() {
         this.var1 = 'val1';
         this.method1 = function() { } ;
}

不同之处在于构造函数是在实例化时正确定义的,我们省略了调用函数,这是合法的(虽然我认为这很混乱)。

我发现它有些括号更明确,并明确调用构造函数:

var oneOff = new  ( function () {
  this.variablea = "variablea";
  this.method = function () {
    return xxx;
  };
} ) () ;

但是为了只创建一个对象,我宁愿使用简单的对象表示法:

var oneOff = {
  variablea : 'valuea',
  method    : function () { return xxx; }
}

他们如何比较表现?

对于new function(){}方法,创建对象需要先创建一个函数,然后在'new'上下文中执行该函数。 另一方面,对象litteral只创建一个对象,因此创建的时间更少,垃圾更少。

关于两种类型对象的使用性能(读/写属性/使用方法的时间),很难说,因为所有的JavaScript解释器都非常复杂且非常不同。在基准测试之前,他们何时以及如何决定优化部分代码是您无法真正了解的。 - 由于那些“随机”优化,基准测试也不是一件容易的事。我敢打赌他们应该在使用性能上非常接近,如果你花时间做一些措施,请告诉我们。

答案 1 :(得分:1)

new function(注意F小写)是在Javascript中创建对象的众多方法之一。解释代码后,将使用oneOffvariablea属性将对象分配给method

实现此目的的另一种方法是使用对象文字符号:

var oneOff = {
    variablea:"variablea",
    method:function () {
        return xxx; //this will be undefined
    }
}

如果只需要oneOff的一个实例,这样可以正常工作,但是如果需要多个oneOff实例,可以使用函数构造函数,如下所示:

function OneOff(){
    this.variablea = "variablea";
}

OneOff.prototype.method = function(){
   return xxx; //one again undefined
}

var firstOneOff = new OneOff();
var secondOneOff = new OneOff();