对象字面值vs函数的Javascript性能提升



让我们往大的方面想。假设你想要整合一款完整的MMO游戏。当然,这涉及大量资源,包括生物、道具、精灵表、贴图、对话、角色等等。在典型的游戏引擎中,你会基于一些任意的指示符(如地图或"区域")加载或卸载这些资源。

是否有Javascript版本?例如,当游戏循环运行时,你是否能够

(伪代码)
If playerPosition = theRightPlace {
    Load Resources for Next Zone
    Unload Resources for Previous Zone
}

这样做是否会提高性能?或者你应该加载游戏的所有资源并完成它?比如在一些区域我有一个类UglyMonster,在另一个区域我有一个类UglierMonster。

我可以通过John Resig的经典继承类结构实例化这两个类(我一直在使用这个结构,直到我点击这个对话开始,它对这种程序很方便)

var UglyMonster = Monster.extend({
    Stuff why it is ugly;
    Make a position!
    Attack player!!!
});
var Monster1 = new UglyMonster();

或函数

function UglyMonster(name, position) {
    Create Ugly Monster!!!! Attack player!
    Stuff why it is ugly
}
var Monster1 = new UglyMonster('Fred', 100);

如果我将它们都声明为变量,那么游戏中的所有怪物都位于全局变量中,不是吗?有没有一种方法来声明变量没有实际构造他们?我是Javascript中整个继承游戏的新手,所以也许我错过了一些明显的东西。

处理这些类的最好方法是什么?离开他们吗?删除它们吗?通过函数实例化?它有明显的不同吗?

我希望我已经清楚地说明了我希望完成的任务。谢谢你!

我不太确定你在问什么,但是

function UglyMonster(name, position) {
   ...
}

var UglyMonster = function (name, position) {
    ...
}

是等价表达式。函数在Javascript中是对象。在这两种情况下,这些函数都被保存为变量,并作为全局对象的属性附加。

在这两种方法中不会有任何明显的性能差异。

至于

有没有一种方法来声明变量而不实际构造它们?

你可以声明一个变量而不定义它。只有var x;。或者,您可以声明一个类构造函数,而不立即实例化该类的对象。您刚刚定义了一个实际上还没有运行的函数。

更新

关于javascript中如何读取函数的更多背景知识。

当javascript引擎解释一个新的作用域时,它首先将代码中的所有变量声明提升到当前作用域的顶部(全局作用域或当前函数)。这些变量"存在",但未定义。然后,它处理函数声明,因为它们在默认情况下被移到顶部。

所以下面的代码

var x = 3+2;
var UglyMonster = function (name, position) {
    ...
}
function UglyMonster2(name, position) {
   ...
}

被解释为如下所示:

var UglyMonster, UglyMonster2,x;
UglyMonster2 = function(name, position) {
   ...
}
x = 3+2;
UglyMonster = function (name, position) {
    ...
}

需要注意的是,在这个例子中没有实际运行任何函数。它们只是被定义了。在运行

之前,不会运行任何函数,也不会创建UglyMonster的实例。

new UglyMonster()。如果你正在创造许多怪物,那么尽可能拖延创造这些怪物是有价值的。但最终,性能将取决于许多因素,唯一可靠的方法是测试它并亲自尝试。

问题真多!让我们试着一个一个地走。

我应该加载和卸载资源吗?

我相信游戏引擎将资源从磁盘加载到内存。在浏览器JavaScript中,你不能从磁盘读取,你必须从网络读取,这很慢。所以只有加载/卸载,如果你有严重的内存使用问题(使用浏览器工具来检查)。

如果我将它们都声明为变量,那么游戏中的所有怪物都位于全局变量

如果你说function UglyMonster是不同的,它不是。它也在全球范围内。如果您希望保持全局作用域的整洁,请将代码包装在一个立即调用的函数表达式中:

(function(){}(
    // your code here
));

是否有一种方法来声明变量而不实际构造它们?

不确定你的意思,但你可以定义对象字面量:

var Monster = {
    attack : function() {  },
    eyes : 5
};

您也可以从任何对象继承Object.create:

var UglyMonster = Object.create(Monster);

处理这些类的最好方法是什么?离开他们吗?删除它们吗?通过函数实例化?它有明显的不同吗?

我不知道你在问什么!:)

相关内容

  • 没有找到相关文章