Maison  >  Article  >  interface Web  >  Comment émuler noSuchMethod au niveau de la propriété en JavaScript ?

Comment émuler noSuchMethod au niveau de la propriété en JavaScript ?

DDD
DDDoriginal
2024-10-18 14:29:03484parcourir

How to Emulate Property-Level noSuchMethod in JavaScript?

Emulating Property-Level noSuchMethod in JavaScript

The noSuchMethod feature in certain JavaScript implementations, such as Rhino and SpiderMonkey, allows for handling of unimplemented methods. However, a similar feature is not natively available for properties.

ECMAScript 6 Proxies to the Rescue

ECMAScript 6 introduced Proxies, which provide a mechanism for customizing fundamental operations, including property access. By leveraging Proxy traps, we can emulate the desired behavior for property lookups using __noSuchMethod__.

Solution Using ES6 Proxies

<code class="javascript">function enableNoSuchMethod(obj) {
  return new Proxy(obj, {
    get(target, p) {
      if (p in target) {
        return target[p];
      } else if (typeof target.__noSuchMethod__ == "function") {
        return function(...args) {
          return target.__noSuchMethod__.call(target, p, args);
        };
      }
    }
  });
}</code>

Example Usage

Consider the following example:

<code class="javascript">function Dummy() {
  this.ownProp1 = "value1";
  return enableNoSuchMethod(this);
}

Dummy.prototype.test = function() {
  console.log("Test called");
};

Dummy.prototype.__noSuchMethod__ = function(name, args) {
  console.log(`No such method ${name} called with ${args}`);
  return;
};

var instance = new Dummy();
console.log(instance.ownProp1);
instance.test();
instance.someName(1, 2);
instance.xyz(3, 4);
instance.doesNotExist("a", "b");</code>

This code will log the following output, demonstrating the noSuchMethod emulation for properties:

value1
Test called
No such method someName called with 1,2
No such method xyz called with 3,4
No such method doesNotExist called with a,b

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!

Déclaration:
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