在阅读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(){..}是什么。任何帮助表示赞赏。感谢。
答案 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中创建对象的众多方法之一。解释代码后,将使用oneOff
和variablea
属性将对象分配给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();