рдХреЙрдлрд╝реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ: рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдердбреНрд╕

CoffeeScript рдСрдмреНрдЬреЗрдХреНрдЯ рддрд░реАрдХреЗ

ECMAScript рдХреЗ 5 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрдИ рдирдП рддрд░реАрдХреЗ рдкреНрд░рдХрдЯ рд╣реБрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдФрд░ рд░реВрд╕реА рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдЕрдХреНрд╕рд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ) рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рд╣реИ рдХрд┐ рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПрдЧреА рдФрд░ ECMAScript рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ 3 рдФрд░ 5 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рд╛рдордЧреНрд░реА

1. Object.create (рдкреНрд░реЛрдЯреЛ [, рдЧреБрдг])
2. Object.defineProperty (рдСрдмреНрдЬреЗрдХреНрдЯ, рдкреНрд░реЙрдкрд░реНрдЯреА, рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░)
3. Object.defineProperties (рдСрдмреНрдЬреЗрдХреНрдЯ, рдЧреБрдг)
4. Object.getOwnPropertyDescriptor (рдСрдмреНрдЬреЗрдХреНрдЯ, рдЧреБрдг)
5. Object.keys (рдСрдмреНрдЬреЗрдХреНрдЯ)
6. Object.getOwnPropertyNames (рдСрдмреНрдЬреЗрдХреНрдЯ)
7. рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░
8. рдПрдХреНрд╕реЗрд╕рд░ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░
9. Object.getPrototypOf (рдСрдмреНрдЬреЗрдХреНрдЯ)
10. Object.preventExtensions (рдСрдмреНрдЬреЗрдХреНрдЯ)
11. Object.isExtensible (рдСрдмреНрдЬреЗрдХреНрдЯ)
12. Object.seal (рдСрдмреНрдЬреЗрдХреНрдЯ)
13. Object.isSealed (рдСрдмреНрдЬреЗрдХреНрдЯ)
14. Object.freeze (рдСрдмреНрдЬреЗрдХреНрдЯ)
15. Object.deepFreeze (рдСрдмреНрдЬреЗрдХреНрдЯ) (рдЧреИрд░-рдорд╛рдирдХ)
16. Object.prototype.hasOwnProperty (рд╕рдВрдкрддреНрддрд┐)
17. Object.prototype.isPrototypOf (рдСрдмреНрдЬреЗрдХреНрдЯ)
18. Object.prototype.propertyIsEnumerable (рдСрдмреНрдЬреЗрдХреНрдЯ)
19. рдирд┐рд╖реНрдХрд░реНрд╖



Object.create (рдкреНрд░реЛрдЯреЛ [, рдЧреБрдг])


Object.create () рджрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рддрд╛ рд╣реИ:

object = Object.create property: 1 object.property # 1 

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 object = Object.create {}, property: value: 1 object.property # 1 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рдЦрд╛рд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдЧрд╛ред

рд░рд╣рд╕реНрдпрдордп рдореВрд▓реНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рди рдХрд░реЗрдВ, рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рд╣рдо рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рддреЛ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИрдВ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЗ рдЙрддреНрддрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 object = Object.create property: 1 object.property = 2 object.property # 2 object = Object.create {}, property: value: 1 object.property = 2 object.property # 1 

рддреБрдо рдХреНрдпрд╛ рдкреВрдЫрддреЗ рд╣реЛ?
рдмрд╕, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рд░реВрдк рдпрд╣ рд╣реИ рдХрд┐ рдЧреБрдг рдХреЗрд╡рд▓-рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдЯрд╛рдП рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ, рдФрд░ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ!

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

 object = Object.create {} property: value: 1 object.property = 2 object.property # 1 object.method = -> object.property do object.method # 1 key for key of object # method delete object.property # false 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдпрд╛ рдорд╛рди рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕реЗ рдПрдиреНрдпреВрдорд░реЗрдЯ рдХрд░реЗрдВ, рдпрд╛ рд╣рдЯрд╛рдПрдВред

рдФрд░ рдЕрдм рдореИрдВ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ Object.create () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 A = a: 1 b: 2 B = Object.create A, c: value: 3 enumerable: on for own key, value of B console.log " # {key}: # {value}" # c:3, a:1, b:2 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдП рд╕реЗ рдЧреБрдгреЛрдВ рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИ рддрд╛рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдмреА рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХрдерди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдСрдкрд░реЗрдЯрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд▓реВрдк рдХреЗ рд╢рд░реАрд░ рдореЗрдВ hasOwnProperty рд╡рд┐рдзрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрддреА рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЪреЗрди рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рд░реЛрдХрддреА рд╣реИред
рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрджрд░ рд╕реЗ рдирд┐рд░реНрдорд╛рдг () рд╡рд┐рдзрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рддреЛ рдореИрдВ рдЬреЛ рднреА рдкрдврд╝рддрд╛ рд╣реВрдВ рдЙрд╕реЗ рд╕рдореЗрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рддрд╛ рд╣реВрдВ:

 Object.create = (object, properties) -> # 1. If Type(O) is not Object or Null throw a TypeError exception. if typeof object is not 'object' throw new TypeError "Object.create: # {object.toString()} is not an Object or Null" # 2. Let obj be the result of creating a new object as if by the expression new Object() # where Object is the standard built-in constructor with that name __new__ = new Object # 3. Set the [[Prototype]] internal property of obj to O. if '__proto__' of init __new__.__proto__ = object; else __new__.constructor:: = object # 4. If the argument Properties is present and not undefined, add own properties # to obj as if by calling the standard built-in function Object.defineProperties # with arguments obj and Properties. if typeof props is not 'undefined' Object.defineProperties object, props # 5. Return obj. object 


Object.defineProperty (рдСрдмреНрдЬреЗрдХреНрдЯ, рдкреНрд░реЙрдкрд░реНрдЯреА, рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░)


Object.defineProperty () рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдирдИ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ / рдпрд╛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдирддреАрдЬрддрди, рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред

рдСрдмреНрдЬреЗрдХреНрдЯ - рд╡рд╣ рд╡рд╕реНрддреБ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рд╕рдВрдкрддреНрддрд┐ - рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо
рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ - рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 object = {} Object.defineProperty object, 'property' value: 1 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореВрд▓реНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╣реИрдВред рдЕрдм рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рдирдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде, рдирдП рд╢рдмреНрдж ECMAScript 5 рдореЗрдВ рднреА рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╡рд░рдгрдХ ред

рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рди рдФрд░ рдПрдХреНрд╕реЗрд╕ рд╕реНрддрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдирдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдЖрдкрдХреЛ рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
ECMAScript 5 рдХреЗ рдЖрдЧрдорди рд╕реЗ рдкрд╣рд▓реЗ, рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╛рдореВрд▓реА рдЙрдкрдХрд░рдг рдЙрдкрд▓рдмреНрдз рдереЗ: Object.prototype.propertyIsEnumerable () рдФрд░ Object.prototype.hasOwnProperty () ред

рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ ( рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ ), рдПрдХреНрд╕реЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ ( рдПрдХреНрд╕реЗрд╕рд░ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ ) рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ ( рдЬреЗрдиреЗрд░рд┐рдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ )ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рд╡рд░реНрдгрди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╣реИред

рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░


рдпрд╣ рдЧреБрдг рддрдм рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд┐рд╡рд░рдгрдХ рдЦрд╛рд▓реА рд╣реЛ рдпрд╛ рд╡рд┐рд╡рд░рдгрдХ рдХреЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ: рдореВрд▓реНрдп рдпрд╛ рд▓реЗрдЦрди ред
рдЖрдВрддрд░рд┐рдХ рд╡рд┐рдзрд┐ [[IsDataDescriptor]] рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:

 IsDataDescriptor (Descriptor): if Descriptor is undefined return off if !Descriptor.[[Value]] and !Descriptor.[[Writable]] return off return on 

рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп ред

 { configurable: false, enumerable: false } 

рдЖрдЗрдП рдЕрдм рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

рдореВрд▓реНрдп - рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп - рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп - рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
enumerable - рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЧрдгрдирд╛ рдХреА рдкрд╣реБрдБрдЪ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рднреАрддрд░, рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд╛рдо рд╣реИрдВ: [[рдореВрд▓реНрдп]] , [[рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп]] , [[рдЕрд╕рдВрдЦреНрдп]] , [[рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп]] ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЭреВрдареА рд╣реИрдВ , рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдЗрд╕рдХрд╛ рдорд╛рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ ред

рдиреЛрдЯ: рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, ECMAScript 3 рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╡рд░рдгрдХ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ DontEnum , ReadOnly рдФрд░ DontDelete рдирд╣реАрдВ рд╣реИрдВ ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╕реНрд╡рдпрдВ рд╡рд╕реНрддреБ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 Object.defineProperty {}, 'property' value: 1 writable: on enumerable: on configurable: on 

рдЕрдм рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рд╡рд╕реНрддреБ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 Object::method = -> @ 

рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА рдФрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдиреБрдХрд╕рд╛рди рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рдорд╛рдирдХ рдореЗрдВ рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓рд╛ рдПрдХ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдЧреАред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рд╡рд┐рдзрд┐ рдХреЛ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдВрддрд┐ рд╕реЗ рд╕реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 Object::my_super_method = -> @ 

рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдХрднреА рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдЧреАред

рджреВрд╕рд░реА рдмрд╛рдд, рд╣рдо рдЬреЛ рд╡рд╕реНрддреБ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рд╡рд╣ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЧрд┐рд░рддрд╛ рд╣реИ:

 Object::method = -> 1 list = [] do list.method # 1 

рддреАрд╕рд░рд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдкрд╛рд╕ enumerable рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рд╣реА рдореВрд▓реНрдп рд╣реЛрдЧрд╛:

 Object::method = -> 1 object = {}; i for i of object # method 

рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╡рд┐рдзрд┐ рд╡рд┐рдзрд┐ рдХреА рдЧрдгрдирд╛ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ:

 i for own i of object 

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ рднреА рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 Object.defineProperty Object::, 'method' value: -> 1 enumerable: false i for i of object # 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рдзрд┐ рдХрдерди рдХреЗ рд▓рд┐рдП рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдереА ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдРрд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрднреА-рдХрднреА рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдЙрдЪрд┐рдд рдЙрдкрд╛рдп рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рд░реЗрдХ рдкрд░ рдХрджрдо рди рд░рдЦреЗрдВ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

рдЧреМрдг рд╡рд┐рд╡рд░рдгрдХ


рдПрдХ рдПрдХреНрд╕реЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЧреЗрдЯ рдпрд╛ рд╕реЗрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рд╕рд╛рде рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореВрд▓реНрдп рдФрд░ рд▓реЗрдЦрди рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ :

 IsDataDescriptor (Descriptor): if Descriptor is undefined return off if !Descriptor.[[Get]] and !Descriptor.[[Set]] return off return on 

рддрдм рдЖрдВрддрд░рд┐рдХ рд╡рд┐рдзрд┐ [[DefineOwnProperty]] рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рднреАрддрд░, рд╡рд┐рд╡рд░рдгрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд╛рдо рд╣реИрдВ: [[рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ]] рдФрд░ [[рд╕реЗрдЯ]] ред

рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рдФрд░ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:

 property = 0 object = Object.defineProperty {}, 'property' get: -> property set: (value) -> property = value configurable: on enumerable: on object.property = 1 # set object.property # 1, get 

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдбреЗрдЯрд╛ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдЕрдиреБрдордд рдирд╣реАрдВ рд╣реИ:

 Object.defineProperty {}, 'property' get: -> 1 value: 1 # TypeError: property descriptors must not specify a value or be writable when a getter or setter has been specified 'value: 1" 

Object.create () рдХреЗ рд╕рд╛рде , рд╡рд┐рд░рд╛рд╕рдд рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреА рд╣реИ:

 A = a: 1 b: 2 B = Object.defineProperty A, 'c' value: 3 enumerable: on for own key, value of B console.log " # {key}: # {value}" # a:1, b:2, c:3 


Object.defineProperties (рдСрдмреНрдЬреЗрдХреНрдЯ, рдЧреБрдг)


рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирдП рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ / рдпрд╛ рдореМрдЬреВрджрд╛ рдЧреБрдгреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, Object.defineProperties () рдХреЗрд╡рд▓ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде Object.defineProperty () рдХреЗ рд╕рдорд╛рди рд╣реИред

 object = Object.defineProperties {}, a: value: 1 enumerable: on b: value: 2 enumerable: on for own key, value of object console.log " # {key}: # {value}" # a:1, b:2 

рдпрджрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рдирд╛рдо рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 A = a: 1 b: 2 object = Object.defineProperties {} a: value: 3 enumerable: on b: value: 4 enumerable: on for own key, value of object console.log " # {key}: # {value}" # a:3, b:4 

рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдПрдХреНрд╕реЗрд╕рд░ рдХреЛ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓рддрд╛:

 object = Object.defineProperty {}, 'property' get: -> 0 Object.defineProperty object, 'property' get: -> 1 object.property # 0 

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 object = Object.defineProperty {}, 'property' get: -> 0 configurable: on Object.defineProperty object, 'property' get: -> 1 object.property # 1 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, IE рд╕рдВрд╕реНрдХрд░рдг 9 рдХреЗ рдиреАрдЪреЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 8 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ Object.defineProperty () рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ Object.defineProperties () рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

 Object.defineProperties = (object, properties) -> type = (object) -> Object::toString.call object is '[object Object]' if !type object and !type properties throw new TypeError 'Object.defineProperties(Object object, properties Object)' if !Object.defineProperty return object; for own key, value of properties Object.defineProperty object, key, value object 


Object.getOwnPropertyDescriptor (рдСрдмреНрдЬреЗрдХреНрдЯ, рдЧреБрдг)


рдпрд╣ рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

 object = {} Object.defineProperty object, 'property' value: 1 writable: off enumerable: off configurable: on Object.getOwnPropertyDescriptor object, 'property' ### { value: 1, writable: true, enumerable: true, configurable: true } ### 

рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╡рд░рдгрдХ рдЧреБрдг рдЖрдВрддрд░рд┐рдХ ECMAScript рдЧреБрдг рд╣реИрдВ, Object.getOwnPropertyDescriptor () рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ Object.getOwnPropertyDescriptor () рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

 Object.getOwnPropertyDescriptor {}, 'valueOf' # undefined 

рдХреНрдпреЛрдВрдХрд┐ valueOf рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╣реИ:

 {}.hasOwnProperty 'valueOf' # false 'valueOf' of {} # true 

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдиреЛрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, hasOwnProperty () рд╡рд┐рдзрд┐, рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЧреБрдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИред

рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реАрдзреЗ valueOf рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 {}.constructor::valueOf # function 

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

 object = {} object.constructor::valueOf = 1 object.valueOf # 1 

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд▓реЗрдЦрди рдХреЗ рдпреЗ рд░реВрдк рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ:

 object = {} object.valueOf = 1 object.constructor::valueOf = 2 object.toString # 1 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЛрдИ рд╕рдВрдкрддреНрддрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ( рд╕реНрд╡рдпрдВ рдХреА рд╕рдВрдкрддреНрддрд┐ ) рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдкрд░ рд╕реЗрдЯ рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рдореВрд▓реНрдп рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдХреЛ "рдУрд╡рд░рд▓реИрдк" рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдмрд╕ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рд╕реАрдзреЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИ:

 object = {} object.toString = 1 object.constructor::valueOf = 2 object.toString # 1 object.constructor::valueOf # 2 'valueOf' of object # true object.hasOwnProperty 'valueOf' # false 

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЦреЛрдЬ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬрд╛рд░реА рд╣реИ:

 object = {} object.constructor::constructor::constructor::property = 1 object.property # 1 

рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 fn = (x) -> x * x fn 2 # 4 fn::constructor 4 # 8 


Object.keys (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдгреЛрдВ рд╡рд╛рд▓реЗ рдирд╛рдо рд╣реЛрддреЗ рд╣реИрдВред

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 Object.keys a: 1 b: 2 .length # 2 

рдЕрдХреНрд╕рд░, Object.keys рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 object = a: 1 b: 2 Object.keys(object).filter (i) -> i if object[i] > 1 # 2 

Object.keys () рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:

 Object.keys = (object) -> i for own i of object 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рд╣рдореЗрд╢рд╛ рдЗрдирдкреБрдЯ рддрд░реНрдХ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рдж, Object.keys () рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

 Object.keys = (object) -> if Object::toString.call(object) is not '[object Object]' throw new TypeError "Object.keys: # {object.toString()} is not an Object" i for own i of object 

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ Object.keys () рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 Object.keys = (object) -> # 1. If the Type(O) is not Object, throw a TypeError exception if Object::toString.call(object) is not '[object Object]' throw new TypeError "Object.keys: # {object.toString()} is not an Object" # 2. Let count be the number of own enumerable properties of O count = Object.getOwnPropertyNames(object).length # 3. Let array be the result of creating a new Object as if by the expression new Array(n) # where Array is the standard built-in constructor with that name array = new Array count # 4. Let index be 0 index = 0; # 5. For each own enumerable property of O whose name String is P for own property of object if !object.propertyIsEnumerable property continue # a. Call the [[DefineOwnProperty]] internal method of array with arguments # ToString(index), the PropertyDescriptor # {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, and false # b. Increment index by 1 Object.defineProperty array, index++, value: property writable: on enumerable: on configurable: on # 6. Return array array 


Object.getOwnPropertyNames (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдкрдиреЗ рдЧреБрдгреЛрдВ рдХреЗ рдирд╛рдо рд╣реЛрддреЗ рд╣реИрдВред
Object.keys (рдСрдмреНрдЬреЗрдХреНрдЯ) рдХреЗ рд╡рд┐рдкрд░реАрдд , рдпрд╣ рд╡рд┐рдзрд┐ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреА рд╣реИ:

 object = a: 1 b: 2 Object.defineProperty object, '' value: 3, enumerable: off, Object.keys(object).length # 2 Object.getOwnPropertyNames(object).length # 3 

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ Object.getOwnPropertyNames () рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 Object.getOwnPropertyNames = (object) -> # 1. If the Type(O) is not Object, throw a TypeError exception if Object::toString.call(object) is not '[object Object]' throw new TypeError "Object.getOwnPropertyNames: # {object.toString()} is not an Object" # 2. Let array be the result of creating a new Object as if by the expression new Array(n) # where Array is the standard built-in constructor with that name array = new Array # 3. Let index be 0 index = 0; # 4. For each named own property P of O for own name of object # a. Let name be the String value that is the name of P. # b. Call the [[DefineOwnProperty]] internal method of array with arguments # ToString(n), the PropertyDescriptor {[[Value]]: name, [[Writable]]: true, # [[Enumerable]]: true, [[Configurable]]: true}, and false. # c. Increment n by 1. Object.defineProperty array, index++, value: name writable: on enumerable: on configurable: on # console.log array # 5. Return array array 


Object.getPrototypOf (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА [[рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк]] рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред

 object = {} Object.getPrototypeOf(object).property = 1 object.property # 1 

рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 Object.getPrototypeOf = (object) -> if Object::toString.call(object) is not '[object Object]' throw new TypeError "Object.getPrototypeOf: # {object.toString()} is not an Object" object.__proto__ or object.constructor:: 


Object.preventExtensions (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИред

 object = a: 1 Object.preventExtensions object object.b = 1 'b' of object # false Object.getOwnPropertyDescriptor object, 'a' # { configurable: true, enumerable: true, value: 1, writable: true } 

рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрдВрдж рд╡рд╕реНрддреБ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕: Object.defineProperty рдФрд░ Object.defineProperties рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдВрдЧреЗ!

 object = {} Object.preventExtensions object Object.defineProperty object, 'property' value: 1 # TypeError: Object.defineProperties(object, 'property', ...) is not extensible 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, TypeError рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рдЦреНрдд рдореЛрдб рдореЗрдВ рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 do -> 'use strict' object = {} Object.preventExtensions object object.property = 1 # "TypeError: object.property is not extensible 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд░реНрд░рд░ рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛!


Object.isExtensible (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

 object = {} Object.preventExtensions object Object.isExtensible object # false 


Object.seal (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕реАрд▓ рдХрд░рддрд╛ рд╣реИред

 Object.seal = Object.preventExtensions + {[[Configurable]]: off} 

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 object = property: 1 Object.seal object delete object.property # false Object.getOwnPropertyDescriptor object, 'property' # { configurable: false, enumerable: true, value: 1, writable: true } 

Object.seal () рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

 Object.getOwnPropertyDescriptor(Object.seal property: 1, 'property').configurable # false 

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ рд╕реАрд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдЧреБрдг рд╣реИрдВ:

 object = {} Object.defineProperty, 'property' value: 1 Object.seal object delete object.property # false delete object # false object.property # 1 object # Object 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рд▓реАрдЯ [[рдбрд┐рд▓реАрдЯ]] рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреЗрд╡рд▓ рдЧреБрдг рд╣рдЯрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЪрд░рдг рдореЗрдВ, рд╕рднреА рдЪрд░ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХреАрд╡рд░реНрдб рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВред

рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд╢реНрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 global.object = {} #  @object,     Object.seal object delete object object # ReferenceError: object is not defined 'object' 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╕реНрддреБрдУрдВ рдХреА рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╕реНрддреБ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдЖрддреА рд╣реИ:

 do -> global.object = {} object # Object 

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рдПрдХ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ:

 object = {} object = undefined object # undefined 

рдпрджрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрд╢рдХреНрдд рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ рдЪрд░ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рдерд╛ред

1. CoffeeScript рдореЗрдВ рдХреЛрдИ рд╢реВрдиреНрдп рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рд╢реВрдиреНрдп 0 рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ ред
2. рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рджрд┐рдирд╛рдВрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдм рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХреЙрд▓ рд╡рд┐рдзрд┐ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ:

  delete Date.now # true Date.now # undefined delete Function.call Function.call # [Function: call] 

рдЙрд╕реА рд╕рдордп, рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ ([рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп]]: рд╕рдЪ) :

  delete Object # true typeof Object # undefined Object # ReferenceError: Object is not defined 

2. рдореИрдВрдиреЗ рдбрд┐рд▓реАрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдорд╛рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╡рд┐рд╖рдп рд╣реИред рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕ рдкреНрд░рд╢реНрди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдХрдВрдЧреИрдХреНрд╕ рдХреЗ рд▓реЗрдЦ рдХреЛ рдПрдХ рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ рдбрд┐рд▓реАрдЯ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ

рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ Object.seal () рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдгреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдпрд╣ рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЛ рднреА рд░реЛрдХрддрд╛ рд╣реИ:

 object = {} Object.seal object object.property = 1 object.property # undefined 

рдиреЛрдЯ: рд╕рд░реНрд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ TypeError рдлреЗрдВрдХ рджреЗрдЧрд╛!

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реАрд▓рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рдВрд╢реЛрдзрди рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ:

 object = property: 1 Object.seal object object.property = 2 object.property # 1 

рдЬреИрд╕рд╛ рдХрд┐ Object.preventExtensions () рдХреЗ рд╕рд╛рде , рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕рдЦреНрдд рдореЛрдб рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдпрд╛ Object.defineProperty / Object.defineProperties рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдПрдХ TypeError рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛!

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ Object.seal () рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 Object.seal = (object) -> # 1. If Type(O) is not Object throw a TypeError exception if Object::toString.call(object) is not '[object Object]' throw new TypeError "Object.seal: # {object} is not callable!" # 2. For each named own property name P of O, Object.getOwnPropertyNames(object).forEach (property) -> # a. Let desc be the result of calling the [[GetOwnProperty]] internal method of O with P __desc__ = Object.getOwnPropertyDescriptor object, property # b. If desc.[[Configurable]] is true, set desc.[[Configurable]] to false. if __desc__.configurable is on __desc__.configurable = off # c. Call the [[DefineOwnProperty]] internal method of O with P, desc, and true as arguments Object.defineProperty object, property, __desc__ # 3. Set the [[Extensible]] internal property of O to false # 4. Return O. Object.preventExtensions object 


Object.isSealed (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд╕реНрддреБ рд╕реАрд▓ рд╣реИред рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

 object = {} Object.seal object Object.isSealed object # true 

рдпрджрд┐ рдХрд┐рд╕реА рдЦрд╛рд▓реА рд╡рд╕реНрддреБ рдХреЛ рдЧреИрд░-рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╕реАрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА:

 object = {} Object.preventExtensions object Object.isSealed object # true 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдЕрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реАрд▓ рд╣реЛрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛:

 object = property: 1 Object.preventExtensions object Object.isSealed object # false 

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ Object.isSealed () рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 Object.isSealed = (object) -> # 1. If Type(O) is not Object throw a TypeError exception. if Object::toString.call(object) is not '[object Object]' throw new TypeError "Object.isSealed: # {object} is not callable!" # 2. For each named own property name P of O then Object.getOwnPropertyNames(object).forEach (property) -> # a. Let desc be the result of calling the [[GetOwnProperty]] internal method of O with P. __desc__ = Object.getOwnPropertyDescriptor object, property # b. If desc.[[Configurable]] is true, then return false. if __desc__.configurable is on return off # 3. If the [[Extensible]] internal property of O is false, then return true. # 4. Otherwise, return false. if !Object.isExtensible(object) then on else off 


рдСрдмреНрдЬреЗрдХреНрдЯ.рдлрд╝реНрд░реАрдЬрд╝ (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред

 Object.freeze = Object.preventExtensions + Object.seal + {[[Writable]]: off} 

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, Object.freeze () рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирдП рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

 object = a: 1 object.a = 0 # false    object.b = 0 # false     delete object.a # false    Object.getOwnPropertyDescriptor object, 'a' # { configurable: false, enumerable: true, value: 1, writable: false} 

рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХреА рд╣реИ Object.preventExtensions () рдФрд░ Object.seal () рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ "рдлреНрд░реАрдЬ" рдХреА рдЧрд╣рд░рд╛рдИ:

 object = property: internal: 1 Object.freeze object object.property = 0 # false object.property.internal = 0 # true Object.getOwnPropertyDescriptor(object.property, 'internal').writable # true 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╕реНрддрд░ рдХреЗ рдХреЗрд╡рд▓ рдмрдЪреНрдЪреЗ рдХреЗ рдЧреБрдг рдЕрд╡рд░реБрджреНрдз рд╣реИрдВ!
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, ECMASctipt 5 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдЧрд╣рд░реА рдлреНрд░реАрдЬ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП Object.deepFreeze () рдХреЛ рд╕реНрд╡рдпрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

 Object.deepFreeze = (object) -> isObject = (value) -> Object::toString.call(value) is '[object Object]' if !isObject object throw new TypeError "Object.deepFreeze: # {object} is not callable!" for own key, value of object if isObject(value) and !Object.isFrozen value Object.deepFreeze(value) Object.freeze object object = property: internal: 1 Object.deepFreeze object Object.getOwnPropertyDescriptor(object.property, 'internal').writable # false 

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ Object.freeze () рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 Object.freeze = (object) -> # 1. If Type(O) is not Object throw a TypeError exception if Object::toString.call(object) is not '[object Object]' throw new TypeError "Object.freeze: # {object} is not callable!" # 2. For each named own property name P of O, Object.getOwnPropertyNames(object).forEach (property) -> # a. Let desc be the result of calling the [[GetOwnProperty]] internal method of O with P __desc__ = Object.getOwnPropertyDescriptor object, property # b. If IsDataDescriptor(desc) is true, then # If desc.[[Writable]] is true, set desc.[[Writable]] to false if __desc__.value and __desc__.writable is on __desc__.writable = off # c. If desc.[[Configurable]] is true, set desc.[[Configurable]] to false if __desc__.configurable is on __desc__.configurable = off # d. Call the [[DefineOwnProperty]] internal method of O with P, desc, and true as arguments Object.defineProperty object, property, __desc__ # 3. Set the [[Extensible]] internal property of O to false # 4. Return O. Object.preventExtensions object 


Object.isFrozen (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдЬрдореА рд╣реИ рдпрд╛ рдирд╣реАрдВред

 object = property: 1 Object.isFrozen object # false Object.freeze object Object.isFrozen object # true 

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ Object.isFrozen () рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди :

 Object.isFrozen = (object) -> # 1. If Type(O) is not Object throw a TypeError exception. if Object::toString.call(object) is not '[object Object]' throw new TypeError "Object.isFrozen: # {object} is not callable!" # 2. For each named own property name P of O then Object.getOwnPropertyNames(object).forEach (property) -> # a. Let desc be the result of calling the [[GetOwnProperty]] internal method of O with P. __desc__ = Object.getOwnPropertyDescriptor object, property # b. If IsDataDescriptor(desc) is true then # i. If desc.[[Writable]] is true, return false. if __desc__.value and __desc__.writable is on return off # c. If desc.[[Configurable]] is true, then return false. if __desc__.configurable is on return off # 3. If the [[Extensible]] internal property of O is false, then return true. # 4. Otherwise, return false. if !Object.isExtensible(object) then on else off 


Object.prototype.hasOwnProperty (рд╕рдВрдкрддреНрддрд┐)


рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдЙрд╕рдХреА рдЕрдкрдиреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

 object = property: 1 object.hasOwnProperty 'property' # true object.hasOwnProperty 'toString' # false 

рдЖрдк рди рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдг, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ, рддреЛ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреА , рдЬреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ:

 object = property: 1 'property' of object # true 'toString' of object # true 

.AsOwnProperty () рд╡рд┐рдзрд┐ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ :

 Object::inherited = 0 object = property: 1 (i for i of object) # [inherited, property] for i of object i if object.hasOwnProperty i # property 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, hasOwnProperty () рд╡рд┐рдзрд┐ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреА рд╣реИ рдХрд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ hasOwnProperty рдирд╛рдо рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдиреБрдорд░реЗрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИ :

 Object::inherited = -> object = own: 1 hasOwnProperty: -> @ for i of object i if object.hasOwnProperty i # inherited, own, hasOwnProperty 

рдмреЗрд╢рдХ, рдпрд╣ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ?

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓рддрд╛ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрджреЗрд╢ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ Object.prototype рдкрд░ hasOwnProperty рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ :

 Object::inherited = -> object = own: 1 hasOwnProperty: -> @ for i of object i if Object::hasOwnProperty.call object, i # own, hasOwnProperty 

.HasOwnProperty рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдпрд╣ рд╡рд┐рдзрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХреА рдЬрд╛рддреА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗ рд╕реАрдзреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдХрд╛рд░рдг рддреЗрдЬреА рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдиреЗ рдмреАрдЪ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЦреЛрдЬ рдЖрдЧреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рднреА рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдХрдм рд╕реЗhasOwnProperty () рд╡рд┐рдзрд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ, рдЗрд╕реЗ рдирд┐рдореНрди рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдЦреЛрдЬрд╛ рдЬрд╛рдПрдЧрд╛:

 Object.getOwnPropertyNames Object.prototype [ 'toString', 'toLocaleString', 'hasOwnProperty', 'valueOf', 'constructor', 'propertyIsEnumerable', 'isPrototypeOf', ] 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реА 8 , рдкреНрд░реЗрд╕реНрдЯреЛ , рдЧреЗрдХреЛ рдЗрдВрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП , рдпреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реЛрдВрдЧреЗ:

  '__lookupGetter__', '__defineGetter__', '__defineSetter__', '__lookupSetter__' 

рдореЗрдВ рдЫрд┐рдкрдХрд▓реА рдЕрднреА рднреА рдЖрдЧреЗ рдЧреБрдг рд╣реЛрдЧрд╛ рдШрдбрд╝реА рдФрд░ unwatch ред

рдЗрд╕рд▓рд┐рдП, рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рд╕реНрдерд╛рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рд▓реВрдк рдмреЙрдбреА рдХреЗ рдмрд╛рд╣рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЪрд░ рдФрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛рдПрдВ:

 object = {} own = Object::hasOwnProperty for i of object i if own.call object, i 

рдЪреВрдВрдХрд┐ рд╡рд┐рдзрд┐ hasOwnProperty () рдЕрдХреНрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреЗ рд▓рд┐рдП-рдХреА , рдореЗрдВ CoffeeScript рдПрдХ рд╡рд┐рд╢реЗрд╖ рдСрдкрд░реЗрдЯрд░ рд╣реИ рдЦреБрдж :

 alert i for own i of object 

рдкреНрд░рд╕рд╛рд░рдг рдкрд░рд┐рдгрд╛рдо:

 var i, __hasProp = {}.hasOwnProperty; for (i in object) { if (!__hasProp.call(object, i)) continue; alert(i); } 

рдСрдкрд░реЗрдЯрд░ рдХреА рдХреА рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдЦреБрдж рдФрд░ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП-рдХреА : рдЖрд▓реЗрдЦ рджреЗрдЦреЗрдВ CoffeeScript: рдПрдХ рдЧрд╛рдЗрдб рдЪрдХреНрд░ рд╡рд┐рд╕реНрддреГрдд ред

рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Object.keys () рдФрд░ Object.getOwnPropertyNames () рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ , рдЬреЛ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдлреЙрд░- рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ ред

Object.prototype.isPrototypOf (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдпрджрд┐ рджреА рдЧрдИ рд╡рд╕реНрддреБ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╣реИ рддреЛ рдЬрд╛рдВрдЪреЗрдВред рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

 object = {} Object::isPrototypeOf object # true Object.isPrototypeOf object # false Function::isPrototypeOf Object # true Function::isPrototypeOf (new ->).constructor # true fn = -> instance = new fn fn::.isPrototypeOf instance # true 


Object.prototype.propertyIsEnumerable (рдСрдмреНрдЬреЗрдХреНрдЯ)


рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

 object = property: 1 object.propertyIsEnumerable 'property' # true object.propertyIsEnumerable 'toString' # false object.propertyIsEnumerable 'prototype' # false object.propertyIsEnumerable 'constructor' # false list = [''] list.propertyIsEnumerable 0 # true list.propertyIsEnumerable 'length' # false 


рдирд┐рд╖реНрдХрд░реНрд╖:


рд╣рдордиреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪ рдХреА ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП ECMAScript 5 рд╕реЗ рдХрдИ рддрд░реАрдХреЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬреЛ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХрд╛рдлреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдПрдХ рдЖрдВрд╢рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрд░реЗ githab рдИ рдкрд░ рдпрд╛ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдпрджрд┐ рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВрдЧреЗ , рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рд╕рдВрдЧрддрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рднреА рдкрд░рд┐рдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

Source: https://habr.com/ru/post/In146440/


All Articles