Handlebars.js: Contrôle d'accès aux propriétés du proto

Créé le 11 janv. 2020  ·  3Commentaires  ·  Source: handlebars-lang/handlebars.js

Après les commentaires de #1633 et #1634 et les problèmes référencés, je pense que ce serait une bonne idée de créer une option d'exécution qui permet de mettre en liste blanche le prototype d'une classe donnée.

Appel du modèle avec

template ({some: "input object"}, { allowedPrototypes: [
  Test
] })

permettrait à une propriété d'être résolue si ce qui suit est vrai.

parent[propertyName] === Test.prototype[propertyName] && Test.prototype.hasOwnProperty(propertyName)

Je pense que ce serait utile lors de l'utilisation de classes personnalisées dans des serveurs Web, car il n'est certainement pas sûr de désactiver les vérifications de prototype dans un tel environnement.

J'aimerais avoir des avis là-dessus.

feature

Commentaire le plus utile

Un problème potentiel est que les utilisateurs s'attendront à ce que l'ajout B aux prototypes autorisés fonctionne dans ce cas :

class A { get a() { return 'a' } }
class B extends A {}

const parent = new B();
parent['a'] === B.prototype['a'] && B.prototype.hasOwnProperty('a') // => false

Ce n'est pas trop mal, cela doit juste être documenté, mais cela surprendrait probablement pas mal de gens.

Tous les 3 commentaires

Un problème potentiel est que les utilisateurs s'attendront à ce que l'ajout B aux prototypes autorisés fonctionne dans ce cas :

class A { get a() { return 'a' } }
class B extends A {}

const parent = new B();
parent['a'] === B.prototype['a'] && B.prototype.hasOwnProperty('a') // => false

Ce n'est pas trop mal, cela doit juste être documenté, mais cela surprendrait probablement pas mal de gens.

Nous pourrions également vérifier si les superclasses sont sur liste blanche, il vous suffit donc de mettre en liste blanche "A" pour que les propriétés de "A" et "B" soient acceptées.

L'inverse est plus difficile, car il a fallu mettre sur liste noire toutes les classes natives, ce qui peut changer avec le temps.

@nknapp Serait-il possible d'utiliser getPrototypeOf et getOwnPropertyDescriptor pour voir si le getter a été défini. Je ne sais pas si cela régresse vers les problèmes déjà résolus ou non.

class Example {
  get hello() {
    return 'world';
  }
}

const obj = new Example();
console.log(obj.hello);
// "world"
console.log(Object.getOwnPropertyDescriptor(obj, 'hello'));
// undefined
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), 'hello'));
// { configurable: true, enumerable: false, get: function get hello() { return 'world'; }, set: undefined }

source : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get#get_Vs._defineProperty

Cette page vous a été utile?
0 / 5 - 0 notes