#1633と#1634からのコメントと参照された問題の後で、特定のクラスのプロトタイプをホワイトリストに登録できるランタイムオプションを作成することをお勧めします。
テンプレートウィットを呼び出す
template ({some: "input object"}, { allowedPrototypes: [
Test
] })
次のことが当てはまる場合、プロパティを解決できます。
parent[propertyName] === Test.prototype[propertyName] && Test.prototype.hasOwnProperty(propertyName)
Webサーバーでカスタムクラスを使用する場合は、そのような環境でプロトタイプチェックをオフにすることは確かに保存されないため、役立つと思います。
それについて意見を述べたいと思います。
潜在的な問題の1つは、許可されたプロトタイプにB
を追加すると、次の場合に機能することをユーザーが期待することです。
class A { get a() { return 'a' } }
class B extends A {}
const parent = new B();
parent['a'] === B.prototype['a'] && B.prototype.hasOwnProperty('a') // => false
これはそれほど悪くはありません。文書化する必要があるだけですが、かなりの数の人を驚かせるでしょう。
スーパークラスがホワイトリストに登録されているかどうかも確認できるため、「A」と「B」のプロパティを承認するには、「A」をホワイトリストに登録するだけで済みます。
逆の場合は、すべてのネイティブクラスをブラックリストに登録する必要があり、時間の経過とともに変更される可能性があるため、より困難です。
@nknapp getPrototypeOf
とgetOwnPropertyDescriptor
を使用して、ゲッターが定義されているかどうかを確認することは可能でしょうか。 これがすでに修正された問題に回帰するかどうかはわかりません。
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 }
ソース: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get#get_Vs._defineProperty
最も参考になるコメント
潜在的な問題の1つは、許可されたプロトタイプに
B
を追加すると、次の場合に機能することをユーザーが期待することです。これはそれほど悪くはありません。文書化する必要があるだけですが、かなりの数の人を驚かせるでしょう。