Je sais que ce n'est pas la manière recommandée de le faire, mais si je déclare les fonctions suivantes, puis les appeler comme constructeurs, quelle sera la différence (le cas échéant) entre les objets résultants?
function Something() {
this.foo = "bar";
}
function something2() {
var that = {};
that.foo = "bar";
return that;
}
var x = new Something();
var y = new something2();
var z = something2();
4 Réponses :
Dans le second cas, l'objet retourné n'hérite rien du constructeur, il y a donc peu de point de l'utiliser comme tel.
> var x = new Something(); > var y = new something2(); > var z = something2();
bref: lié, si vous étendez votre exemple pour utiliser la propriété prototype p> Vous constaterez que le prototype n'est pas hérité dans ce dernier cas: p> La réponse réelle est que vous tapez dans des machines sous-jacentes entièrement différentes. Appeler avec mais une chose amusante se passe dans les étapes 8--10 de la [construction ]] ALGORITHM: Après avoir configuré un nouvel objet vide, puis la fixation de son [[prototype]], il fait un [[[appel]] au constructeur actuel, à l'aide de ce nouvel objet vide-prototype comme Remarque: Vous pouvez accéder à un objet [[prototype]] (qui est différent du
nouveau code> invoque le [[CONSTRUCTION]] Mécanisme, qui consiste à définir la propriété [[prototype]] selon la propriété .pototype code> du constructeur. p> code>. Ensuite, à l'étape 9, s'il s'avère que ce constructeur a renvoyé quelque chose -, il lance ce qui est protégé par prototypalement, passé- cet objet code> qu'il a passé tout ce temps à installer! .pototype de constructeur code>) avec objet.geprotypeof code>: p > Object.getPrototypeOf(new Something()) === Something.prototype // steps 5 & 6
Object.getPrototypeOf(new something2()) === Object.prototype // default
quelque chose2 code>, puisqu'il s'agit d'une fonction d'usine et non d'un constructeur. Si quelque chose est capitalisé, il est censé avoir une sémantique du constructeur, par ex. Nouvelle instance A () d'un code>. Li>
"Utiliser strict"; code> en haut de vos fichiers. L'un des nombreux nettoyages de mode strict est que ceci code> par défaut sur non défini code>, pas l'objet global, donc par ex. Appeler un constructeur sans Nouveau code> entraînera des erreurs le moment où le constructeur tente de joindre des propriétés à non défini code>. li>.
Le «nouveau» est également facultatif (ou en effet non nécessaire) sur la deuxième méthode, mais vise les choses lorsque vous êtes laissé dans la première (cette fenêtre ===)
@ Matt-Vous pouvez défendre contre celui-ci un peu de l'intérieur du constructeur en voyant si ceci code> est l'objet global et la procédure en conséquence.
@Matt, @robg --- ou, viens de mettre "utiliser strict"; code> en haut de votre fichier! Alors ceci code> sera non défini code>.
@Dominic au sommet de la fonction suffit - mais nous devrons attendre Jscript pour suivre la hausse. En général, le mode strict ES5 n'est pas une caractéristique sûre encore, même dans Non-Jscript.
Pourquoi attendre Jscript? Il vous aidera à attraper vos erreurs dans le développement, où vous testez probablement plus que c'est à savoir <= 8. Et cela ne fait rien de mal dans la production.
Invoquant une fonction en tant que constructeur (c'est-à-dire avec le nouveau mot-clé code>) exécute les étapes suivantes:
Ceci code> est le nouvel objet) LI>
- retourner cet objet (si le constructeur n'a pas de
retour code> instruction) li>
ol> Donc, votre deuxième solution renverra simplement un objet simple avec une propriété "FOO". Mais aucun Y code> ni z code> est instance de quelque chose2 code> et n'hérite pas de ce prototype. Il existe des fonctions comme ça, oui, mais ils ne doivent pas être appelés constructeurs (pas de nommage majuscule, aucune invocation avec nouveau code>). Ils appartiennent au modèle d'usine. P> Si vous voulez un constructeur qui peut être exécuté sans neuf, utilisez ce code: p> xxx pré> p>
Je dirais que la chose la plus importante serait le prototype des objets retournés.
var that = new Object();
Soyez un peu méfiant de M. Crockford. Bien qu'il ait beaucoup de bonnes choses à dire, il a des opinions qui ne sont pas d'accord.