Il n'est pas possible de référencer "this" dans une expression spécifiant un littéral d'objet. Soit le faire dans une ligne suivante ou utilisez un constructeur comme celui-ci:
function myobj(a,b) {
this.a = a;
this.b = b;
this.c = this.a + this.b;
}
var test = new myobj(10,20);
En réponse à la méthode est plus rapide, la création avec le constructeur de l'objet est plus rapide. Voici une comparaison de cas de test simple. Run it yourself on JSBIN.
Les résultats montrent que la création d'un objet avec un constructeur vs un littéral d'objet est presque deux fois plus vite:
0.450s: testObjectLiteral
0.506s: testObjectLiteralWithFunction
0.280s: testConstructor
Voici le code de test incorporé:
// timer function
function time(scope){
time.scope = time.scope || {};
if(time.scope[scope]) {
var duration = (new Date()).getTime()-time.scope[scope];
time.scope[scope] = null;
var results = document.getElementById("results");
results.innerHTML = results.innerHTML + '<p>'+(duration/1000).toFixed(3)+'s : '+scope+'</p>';
} else {
time.scope[scope] = (new Date()).getTime();
}
}
// object creation function with constructor
function myobj(a,b) {
this.a = a;
this.b = b;
this.c = this.a + this.b;
}
function testConstructor(iterations) {
var objs = new Array(iterations);
for(i=0;i<iterations;i++) {
objs[i] = new myobj(i,i+1);
}
return objs;
}
function testObjectLiteralWithFunction(iterations) {
var objs = new Array(iterations);
for(i=0;i<iterations;i++) {
objs[i] = {
a: i,
b: i+1,
c: function() {
return this.a + this.b;
}
};
}
return objs;
}
function testObjectLiteral(iterations) {
var objs = new Array(iterations);
for(i=0;i<iterations;i++) {
var item = {
a: i,
b: i+1
};
item.c = item.a + item.b;
objs[i] = item;
}
return objs;
}
var ITERATIONS = 1000000;
time("testObjectLiteral");
testObjectLiteral(ITERATIONS);
time("testObjectLiteral");
time("testObjectLiteralWithFunction");
testObjectLiteralWithFunction(ITERATIONS);
time("testObjectLiteralWithFunction");
time("testConstructor");
testConstructor(ITERATIONS);
time("testConstructor");
+1 pour la solution OOP. – zzzzBov
Merci pour votre aide. Une autre question: est-ce une façon de déclarer un objet plus vite que le "var myObj = {a: 4, b: 5 ....};" un? –
@dizzy_fingers voir le cas de test de performance J'ai ajouté à ma réponse – mbrevoort