[编辑]重要!函数被视为对象,而不是值。所以这个问题是无效的,因为它是基于错误的假设。此编辑可作为注释,以避免混淆任何阅读此问题的人。
让我说我的函数表达式为foo
var foo = function() {
return this.member;
}
我有以下类,并使用" foo"来实例化它的许多对象。作为回调函数。
var simpleClass = function(callback) {
this.member = "I am an instance variable";
this.callback = callback;
}
var a = new simpleClass(foo);
var b = new simpleClass(foo);
var c = new simpleClass(foo);
.
.
.
由于JavaScript中的参数是按值传递的,因此我们将foo的值([编辑]实际上应该是对象)复制到a,b,c和其他变量'打回来。如果我的理解是正确的,那么foo将被复制n次,每次占用每个对象的特定存储空间。
基于这种理解,我对这种情况有一些性能问题:
- 将函数复制到多个变量是否会影响性能?
醇>
因为" foo"的每个副本as simpleClass object" s" callback"占用空间,如果有很多simpleClass对象(例如在DOM库中我有数千个具有相同函数css()的DOM对象),它会显着损害性能吗?或者大多数JavaScript引擎都有解决这种情况的机制,它通常不会造成伤害?
- 在可能创建数百或数千个对象的情况下。将这些共享函数放到对象的原型中总是一个好习惯吗?
醇>
由于所有对象实例共享相同的类原型,如果我们将" foo"函数到simpleClass的原型,然后应该只有一个副本的" foo"并且每个对象实例都将执行" foo"的原型副本。需要的时候。这是一个我们应该遵循的好习惯吗?
我尝试搜索类似的关键字,但无法找到正确的措辞来找到解决此问题的方法。如果我做不清楚的话,请更正我的措辞。当然,如果我有任何误解,请纠正我。我感谢大家的帮助。
答案 0 :(得分:2)
我不太了解这一点,给你一个权威的答案,但我可以这样说:
然后将foo复制n次,每次占用每个对象的特定内存空间。
这是不正确的。 foo
是指向函数的变量。 foo
不是函数,如果你var bar = foo
,bar
现在也指向函数,相同的函数。因此不会复制该功能。该函数的引用被分配给this.callback
。
- 在可能创建数百或数千个对象的情况下。将这些共享函数放到对象的原型中总是一个好习惯吗?
醇>
JavaScript中的优秀做法是什么,也不是好事。有些人喜欢使用类/原型,其他人喜欢使用对象文字。虽然prototype
可以帮助减少应用程序的内存占用量,但这绝对是正确的。看起来像这样:如果您正在使用prototype
,那么您将为JavaScript引擎提供有关该对象的更多信息,即。您的对象与所有这些其他对象类似。 JavaScript引擎应该能够基于此进行优化。我不能对确切的数字说太多,每个供应商可能会有很大差异。
您的代码示例等同于:
function foo() {}
function myClass() {
this.foo = foo;
}
var instance = new myClass();
如果您使用的是原型,请写下:
function myClass() {}
myClass.prototype.foo = function () {};
var instance = new myClass();
如果你使用了对象文字:
function foo() {};
function create_myClass() {
return {
foo: foo
};
}
var instance = create_myClass();
在上述所有情况下,函数foo
永远不会复制。在下面的这些情况下,执行每次都会创建foo
的新副本:
function myClass() {
this.foo = function () {}; // new copy every time
}
var instance = new myClass();
function create_myClass() {
return {
foo: function () {}; // new copy every time
};
}
至于表现。这是我经常给出的提示:在遇到可测量的问题之前不要开始优化。始终使用真实数据进行测量此外,如果您认为您的工作方式很好,那么JavaScript引擎供应商可能会优化该方法。
答案 1 :(得分:1)
在javascript引用中复制的不是对象本身,因此您无法将值赋给回调以从构造函数内部更改函数。你的代码所有那些对象将共享函数,看看这个snipet:
var foo = function() {
return this.member;
}
var simpleClass = function(callback) {
this.member = "I am an instance variable";
this.callback = callback;
}
var a = new simpleClass(foo);
var b = new simpleClass(foo);
alert(a.callback === b.callback ? 'shared' : 'not shared');