Maison > interface Web > js tutoriel > le corps du texte

Comment le « nouveau » opérateur JavaScript fonctionne-t-il de manière magique ?

Mary-Kate Olsen
Libérer: 2024-10-28 12:56:01
original
482 Les gens l'ont consulté

How Does the JavaScript

Démêler l'énigme du "nouvel" opérateur JavaScript

Dans les profondeurs de la complexité de JavaScript se cache une construction mystérieuse réputée pour son potentiel à laisser perplexe : le "nouveau" opérateur. Ses rouages ​​obscurs côtoient la chaîne des prototypes, laissant de nombreuses personnes perdues dans le labyrinthe du code.

Plongez dans le mécanisme du nouvel opérateur

Pour dévoiler les secrets du « nouveau " opérateur, disséquons ses opérations complexes :

  • Il se dispute avec la méthode interne [[Construct]], une force invisible au sein de JavaScript.
  • [[Construct]] élabore méticuleusement un objet avec des propriétés natives.
  • Une danse subtile s'ensuit, où le [[Prototype]] de l'objet est attaché au prototype de fonction. À moins que la fonction ne manque d'un prototype d'objet (le reléguant à des valeurs primitives), Object.prototype intervient gracieusement pour guider l'objet.
  • Le "nouvel" opérateur orchestre alors une grande invocation de la fonction, lui conférant le objet fraîchement créé comme sa valeur "this".
  • Un moment crucial se produit : si la fonction produit une valeur primitive, l'objet généré en interne occupe le devant de la scène. Cependant, si un objet est restitué, l'objet original sombre malheureusement dans l'oubli.

Une lentille alternative

Pour faire la lumière davantage sur l'énigmatique « nouveau » opérateur, explorons une implémentation alternative qui reflète ses actions :

<code class="javascript">function NEW(f) {
  var obj, ret, proto;

  // Prototype verification
  proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype;

  // Object inheritance from `proto`
  obj = Object.create(proto);

  // Function invocation with object as "this"
  ret = f.apply(obj, Array.prototype.slice.call(arguments, 1));

  // Object return
  if (Object(ret) === ret) {
    return ret;
  }
  return obj;
}

// Demonstration:
function Foo(arg) {
  this.prop = arg;
}
Foo.prototype.inherited = 'baz';

var obj = NEW(Foo, 'bar');
console.log(obj.prop); // 'bar'
console.log(obj.inherited); // 'baz'
console.log(obj instanceof Foo); // true</code>
Copier après la connexion

Ce code sert de balise, éclairant la façon dont le « nouvel » opérateur exerce avec diligence ses fonctions dans les coulisses.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!