そこで、プロトタイプを使用するとどれだけ速くなるかを確認するために、これらのテストを作成しました...
function User() {
return {
name: "Dave",
setName: function(n) {
this.name = n;
},
getName: function() {
return this.name;
}
};
}
function UserPrototype() {
if (!(this instanceof UserPrototype)) return new UserPrototype();
this.name = "Dave";
}
UserPrototype.prototype.getName = function() {
return this.name;
};
UserPrototype.prototype.setName = function(n) {
this.name = n;
};
function setName(obj,name)
{
obj.name = name;
}
function getName(obj)
{
return obj.name;
}
//Test 1
var c = 10000000;
var tstart = 0;
var tend = 0;
tstart = new Date().getTime();
for (var j = 0; j < c; j++) {
var newUser = User();
newUser.setName("michael");
newUser.getName();
}
tend = new Date().getTime() - tstart;
console.log("Returning object with methods: " + tend / 1000.0 + " seconds");
//Test 2
tstart = new Date().getTime();
for (var j = 0; j < c; j++) {
var newUser = new UserPrototype();
newUser.setName("michael");
newUser.getName();
}
tend = new Date().getTime() - tstart;
console.log("Using prototypes: " + tend / 1000.0 + " seconds");
//Test 3
tstart = new Date().getTime();
for (var j = 0; j < c; j++) {
var newUser = {name:"dave"};
setName(newUser,"michael");
getName(newUser);
}
tend = new Date().getTime() - tstart;
console.log("Using general functions: " + tend / 1000.0 + " seconds");
私の結果:
Returning object with methods: 9.075 seconds
Using prototypes: 0.149 seconds
Using general functions: 0.099 seconds
最初の 2 つのテストを作成し、結果を見たとき、なぜそれらが表示されているのかを考えました...その理由は、毎回 2 つの新しいメソッド プロパティ インスタンスが作成されるという事実のために、オブジェクトの戻りが遅いためだと考えています。オブジェクトはインスタンス化されますが、プロトタイプ メソッドは関数を 1 回作成するだけなので高速です。一般的な関数呼び出しとプロトタイプの間のパフォーマンスの近さは、私の仮定が正しいと思わせてくれます。
だから私の最初の質問は、私の仮定は正しいですか?
2 つ目の質問は、高パフォーマンスを維持しながら、プロトタイプを使用してより読みやすくするにはどうすればよいかということです。「クラス」にあるように見える方法でプロトタイプをコーディングする方法はありますか (それが理にかなっている場合)
*編集 - Object.create() でテストを行うのを忘れていました。1 つだけ実行して結果を投稿しました。JSFiddle: ( http://jsfiddle.net/k2xl/SLVLx/ )。
私は今得ます:
Returning object with methods: 0.135 seconds fiddle.jshell.net:63
Using prototypes: 0.003 seconds fiddle.jshell.net:72
Using general functions: 0.002 seconds fiddle.jshell.net:81
Returning object.create version: 0.024 seconds
これが解決策のように見えますか?