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.
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 }
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:Das ist nicht so schlimm, es muss nur dokumentiert werden, aber es würde wahrscheinlich einige Leute überraschen.