Objet literal ou prototype
Bonjour,
toujours dans ma recherche de bonne pratique je voulais savoir ce que vous pensiez vis a vis de la maniere de construire des objets en Javascript.
Prototype
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| function Person(name) {
this.name = name;
}
Person.prototype.get_name = function() {
return this.name;
};
Person.prototype.set_name = function(name) {
this.name = name;
};
Person.prototype.set_name1 = function(name) {
this.name = name;
};
Person.prototype.set_name2 = function(name) {
this.name = name;
};
Person.prototype.set_name3 = function(name) {
this.name = name;
};
Person.prototype.set_name4 = function(name) {
this.name = name;
};
Person.prototype.set_name5 = function(name) {
this.name = name;
}; |
Ou Literal
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| var person = function(pname) {
return {
'get_name': function() {
return pname;
},
'set_name': function(name) {
pname = name;
},
'set_name1': function(name) {
pname = name;
},
'set_name2': function(name) {
pname = name;
},
'set_name3': function(name) {
pname = name;
},
'set_name4': function(name) {
pname = name;
},
'set_name5': function(name) {
pname = name;
}
};
}; |
Code:
1 2
| var _p = new Person('John');
var _c = person('John'); |
Merci pour votre experience
Ne pas oublier le prototypage dynamique !
Salut,
Je souhaite porter à votre connaissance une autre possibilité en JavaScript, rarement mis en avant, car peut-être est-elle jugée comme une mauvaise pratique, j’affection tous particulièrement les mauvaise pratiques de ce langage :D
Cette possibilité est de pouvoir modifier dynamiquement le prototype d’un object déjà instancié au run-time, cela est pratique lorsque tes données proviennent d'une ressource externe, par exemples un fichier JSON,
ces données, après évaluation du fichier, sont déjà instanciés en tant que simple Object, Array, RegEx ou String, c’est tout de même bien pratique de pouvoir leur leurs assigner un prototype perso sans avoir à ré-instancier le tous !
Exemple :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| /****************************************************************
* @prototype : Vector2D
*****************************************************************/
var Vector2D = {
/**** Methodes d'instance ****/
scale : function(s) {
this.x *= (s instanceof Object && s.x!==undefined)? s.x : s;
this.y *= (s instanceof Object && s.y!==undefined)? s.y : s;
return this;
},
square : function( ) { return this.x*this.x + this.y*this.y; },
length : function() { return Math.sqrt(this.square()); },
setLength : function(l)
{
this.scale(l/this.length());
return this;
},
normalize : function()
{
var l = this.Length();
if (l != 0.0)
this.scale(1.0 / l)
return this;
},
translate : function(t)
{
this.x += t.x;
this.y += t.y;
return this;
},
/**** Methodes statiques ****/
Add : function ()
{
var v = { x : arguments[0].x, y : arguments[0].y };
v.__proto__ = Vector2D;
for(var i=1;i<arguments.length;i++)
v.translate(arguments[i]);
return v;
},
Sub : function ()
{
var v = { x : arguments[0].x, y : arguments[0].y };
v.__proto__ = Vector2D;
for(var i=1;i<arguments.length;i++)
{
arguments[i].__proto__ = Vector2D;
v.translate(arguments[i].scale(-1));
}
return v;
}
}
var VertexBuffer = [
{ x : 12.65, y : -6.245 },
{ x : -3.2565, y : 65.78 },
{ x : 89.2565, y : 53.41}
];
VertexBuffer.forEach(function(vertice)
{
vertice.__proto__ = Vector2D;
})
console.log(VertexBuffer[0].length());
console.log(Vector2D.Add.apply(null, VertexBuffer));
console.log(Vector2D.Sub.apply(null, VertexBuffer)); |