Handlebars.js: рдкреНрд░реЛрдЯреЛ рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд┐рдпрдВрддреНрд░рдг

рдХреЛ рдирд┐рд░реНрдорд┐рдд 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

рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡рддрдГ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░реЗрдЧрд╛ред

рд╣рдо рдпрд╣ рднреА рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рд╢реНрд╡реЗрддрд╕реВрдЪреА рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ "рдП" рдФрд░ "рдмреА" рд╕реЗ рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ "рдП" рд╢реНрд╡реЗрддрд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рд░рд╛рд╕реНрддрд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рдореВрд▓ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдХрд╛рд▓реА рд╕реВрдЪреА рдореЗрдВ рдбрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

@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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jlubean picture jlubean  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

LengYXin picture LengYXin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

morgondag picture morgondag  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

stevenvachon picture stevenvachon  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

snimavat picture snimavat  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ