Probablement la partie la moins comprise de JavaScript, debout à côté de la chaîne prototype.
La question est donc: comment …
new dataObj(args);
… créer un objet et définir son prototype de chaîne / constructeurs / etc?
Le mieux est de montrer une alternative, pour bien comprendre ce mot-clé.
Le new
opérateur utilise la méthode interne [[Construct]]
, et il fait essentiellement ce qui suit:
[[Prototype]]
interne [[Prototype]]
de cet objet, pointant vers la propriété prototype
Function.
prototype
la fonction n'est pas un objet (valeurs primitives, comme un nombre, une chaîne, un booléen, un indéfini ou nul), Object.prototype
est utilisé à la place. Une implémentation équivalente de ce que fait le new
opérateur peut s'exprimer comme ceci (en supposant que la méthode ECMAScript 5 Object.create
est disponible):
function NEW(f) { var obj, ret, proto; // Check if `f.prototype` is an object, not a primitive proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype; // Create an object that inherits from `proto` obj = Object.create(proto); // Apply the function setting `obj` as the `this` value ret = f.apply(obj, Array.prototype.slice.call(arguments, 1)); if (Object(ret) === ret) { // the result is an object? return ret; } return obj; } // Example usage: function Foo (arg) { this.prop = arg; } Foo.prototype.inherited = 'baz'; var obj = NEW(Foo, 'bar'); obj.prop; // 'bar' obj.inherited; // 'baz' obj instanceof Foo // true
L'expression new C(arg1, arg2)
:
En supposant que C soit une fonction JavaScript (sinon, vous obtenez une erreur):
prototype
" de C
prototype
pour une fonction est un objet (créé automatiquement lorsque la fonction est déclarée) avec son prototype défini sur Object.prototype
et une propriété constructor
renvoyant à la fonction C
C
avec ' this
' set sur le nouvel objet et avec les arguments fournis. C
renvoie un objet, cet objet est le résultat de l'expression. Sinon, l'objet nouvellement créé est le résultat de l'expression. Une alternative à new
dans ECMAScript 5 serait d'utiliser la méthode Object.createObject Object.createObject
.
new C(arg1, arg2)
équivaut à:
var obj = Object.createObject(C.prototype); C.apply(obj, [arg1, arg2]);
Standard JavaScript ne vous permet pas de définir explicitement le prototype d'un objet, donc Object.createObject
ne peut pas être implémenté dans la langue elle-même. Certaines implémentations le permettent via la propriété non standard __proto__. Dans ce cas, le new C
peut être simulé comme ceci:
var obj = {}; obj.__proto__ = C.prototype; C.apply(obj, [arg1, arg2]);