После комментариев № 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
Это не так уж плохо, это просто нужно задокументировать, но это, вероятно, удивит немало людей.
Мы также можем проверить, занесены ли суперклассы в белый список, поэтому вам нужно только внести в белый список «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 }
Самый полезный комментарий
Одна потенциальная проблема заключается в том, что пользователи будут ожидать, что добавление
B
к разрешенным прототипам будет работать в этом случае:Это не так уж плохо, это просто нужно задокументировать, но это, вероятно, удивит немало людей.