Handlebars.js: プロトプロパティへのアクセス制御

作成日 2020年01月11日  ·  3コメント  ·  ソース: handlebars-lang/handlebars.js

#1633と#1634からのコメントと参照された問題の後で、特定のクラスのプロトタイプをホワイトリストに登録できるランタイムオプションを作成することをお勧めします。

テンプレートウィットを呼び出す

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

次のことが当てはまる場合、プロパティを解決できます。

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

Webサーバーでカスタムクラスを使用する場合は、そのような環境でプロトタイプチェックをオフにすることは確かに保存されないため、役立つと思います。

それについて意見を述べたいと思います。

feature

最も参考になるコメント

潜在的な問題の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

これはそれほど悪くはありません。文書化する必要があるだけですが、かなりの数の人を驚かせるでしょう。

全てのコメント3件

潜在的な問題の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 getPrototypeOfgetOwnPropertyDescriptorを使用して、ゲッターが定義されているかどうかを確認することは可能でしょうか。 これがすでに修正された問題に回帰するかどうかはわかりません。

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

このページは役に立ちましたか?
0 / 5 - 0 評価