Handlebars.js: Контроль доступа к свойствам proto

Созданный на 11 янв. 2020  ·  3Комментарии  ·  Источник: handlebars-lang/handlebars.js

После комментариев № 1633 и № 1634 и упомянутых проблем я думаю, что было бы неплохо создать параметр времени выполнения, который позволяет внести прототип данного класса в белый список.

Вызов шаблона остроумия

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

позволит разрешить свойство, если верно следующее.

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

Я думаю, что это было бы полезно при использовании пользовательских классов в веб-серверах, потому что отключать проверки прототипов в такой среде, безусловно, не спасает.

Я хотел бы иметь мнения об этом.

Самый полезный комментарий

Одна потенциальная проблема заключается в том, что пользователи будут ожидать, что добавление 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 Комментарий

Одна потенциальная проблема заключается в том, что пользователи будут ожидать, что добавление 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», чтобы получить принятые свойства из «A» и «B».

Обратный путь более сложен, потому что требовалось внести в черный список все нативные классы, которые со временем могут измениться.

@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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги