La méthode handler.setPrototypeOf() est une trappe pour intercepter Object.setPrototypeOf().

Syntaxe

var p = new Proxy(cible, {
  setPrototypeOf: function(cible, prototype) {
  }
});

Paramètres

Les paramètres suivants sont passés à la méthode setPrototypeOf. this est lié au gestionnaire.

cible
L'objet cible.
prototype
Le nouveau prototype de l'objet ou null.

Valeur de retour

La méthode setPrototypeOf renvoie true si la propriété interne [[Prototype]] a bien été modifiée et false sinon.

Description

La méthode handler.setPrototypeOf est une trappe utilisée pour intercepter les opérations de Object.setPrototypeOf().

Interceptions

Cette trappe permet d'intercepter :

Invariants

Si les invariants suivants ne sont pas respectés, le proxy renverra une exception TypeError :

  • Si cible n'est pas extensible, le paramètre prototype doit être le même valeur que Object.getPrototypeOf(cible).

Exemples

Si on souhaite interdire la définition d'un nouveau prototype pour un objet, on peut utiliser une méthode setPrototypeOf qui renvoie false ou qui génère une exception.

Avec cette première approche, toute opération qui voudra modifier le prototype génèrera une exception. On aura par exemple Object.setPrototypeOf() qui créera et lèvera l'exception TypeError. Si la modification est effectuée par une opération qui ne génère pas d'exception en cas d'échec (comme  Reflect.setPrototypeOf()), aucune exception ne sera générée.

var handlerReturnsFalse = {
    setPrototypeOf(target, newProto) {
        return false;
    }
};

var newProto = {}, target = {};

var p1 = new Proxy(target, handlerReturnsFalse);
Object.setPrototypeOf(p1, newProto); 
// lève une TypeError
Reflect.setPrototypeOf(p1, newProto); 
// renvoie false

Avec cette seconde approche, toute tentative de modification génèrera une exception. On utilisera celle-ci lorsqu'on souhaite qu'une erreur se produisent, y compris pour les opérations qui ne génèrent habituellement pas d'exception ou si on souhaite générer une exception sur mesure.

var handlerThrows = {
    setPrototypeOf(target, newProto) {
        throw new Error("erreur custom");
    }
}; 

var newProto = {}, target = {};

var p2 = new Proxy(target, handlerThrows);
Object.setPrototypeOf(p2, newProto); 
// lève une exception new Error("erreur custom")
Reflect.setPrototypeOf(p2, newProto); 
// lève une exception new Error("erreur custom")

Spécifications

Spécification État Commentaires
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de '[[SetPrototypeOf]]' dans cette spécification.
Standard Définition initiale.
ECMAScript Latest Draft (ECMA-262)
La définition de '[[SetPrototypeOf]]' dans cette spécification.
Projet  

Compatibilité des navigateurs

Update compatibility data on GitHub
OrdinateurMobileServeur
ChromeEdgeFirefoxInternet ExplorerOperaSafariWebview AndroidChrome pour AndroidEdge MobileFirefox pour AndroidOpera pour AndroidSafari pour iOSSamsung InternetNode.js
Support simpleChrome ? Edge ? Firefox Support complet 49IE Aucun support NonOpera ? Safari ? WebView Android ? Chrome Android ? Edge Mobile ? Firefox Android Support complet 49Opera Android ? Safari iOS ? Samsung Internet Android ? nodejs Support complet 6.0.0

Légende

Support complet  
Support complet
Aucun support  
Aucun support
Compatibilité inconnue  
Compatibilité inconnue

Voir aussi

Étiquettes et contributeurs liés au document

Contributeurs à cette page : SphinxKnight
Dernière mise à jour par : SphinxKnight,