Handlebars.js: Zugriffskontrolle auf Proto-Eigenschaften

Erstellt am 11. Jan. 2020  ·  3Kommentare  ·  Quelle: handlebars-lang/handlebars.js

Nach den Kommentaren aus #1633 und #1634 und den angesprochenen Problemen halte ich es für eine gute Idee, eine Laufzeitoption zu erstellen, die es ermöglicht, den Prototyp einer bestimmten Klasse auf die Whitelist zu setzen.

Nennen Sie die Vorlage Witz

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

würde es ermöglichen, dass eine Eigenschaft aufgelöst wird, wenn Folgendes zutrifft.

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

Ich denke, es wäre hilfreich, wenn benutzerdefinierte Klassen in Webservern verwendet werden, da es in einer solchen Umgebung sicherlich nicht sicher ist, Prototypenprüfungen auszuschalten.

Meinungen dazu hätte ich gerne.

feature

Hilfreichster Kommentar

Ein mögliches Problem besteht darin, dass Benutzer erwarten, dass das Hinzufügen B zu den zulässigen Prototypen in diesem Fall funktionieren würde:

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

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

Das ist nicht so schlimm, es muss nur dokumentiert werden, aber es würde wahrscheinlich einige Leute überraschen.

Alle 3 Kommentare

Ein mögliches Problem besteht darin, dass Benutzer erwarten, dass das Hinzufügen B zu den zulässigen Prototypen in diesem Fall funktionieren würde:

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

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

Das ist nicht so schlimm, es muss nur dokumentiert werden, aber es würde wahrscheinlich einige Leute überraschen.

Wir könnten auch prüfen, ob Superklassen auf der Whitelist stehen, sodass Sie nur „A“ auf die Whitelist setzen müssen, damit Eigenschaften von „A“ und „B“ akzeptiert werden.

Der umgekehrte Weg ist schwieriger, weil es erforderlich war, alle nativen Klassen auf die schwarze Liste zu setzen, was sich im Laufe der Zeit ändern kann.

@nknapp Wäre es möglich, getPrototypeOf und getOwnPropertyDescriptor zu verwenden, um zu sehen, ob der Getter definiert wurde. Ich bin mir nicht sicher, ob dies auf die bereits behobenen Probleme zurückgeht oder nicht.

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 }

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen