Доброй ночи. Столкнулся с таким поведением цикла for in:
var o = {a: 1, b: 2};
var obj = {a: 666, b: 777, c: 3, d: 4};
Object.setPrototypeOf(o, obj);
for (let k in o) {
console.log(k, o[k]);
}
// a 1
// b 2
// c 3
// d 4
Где a: 666 и b: 777?
Т.е происходит затенение и он не перебирает свойства с такими же именами?
Если верить консоли, For in не виноват, это setPrototypeOf не захотел дублировать имена, так уж он устроен, наверное, чтоб For in потом не мучился, и перебирал только уникальные ключи
Cвойства объекта javascript и свойства свойства прототипа объекта отличаются вот чем
1 происхождением
2 предназначением
3 доступом
Происхождение свойства или метода может быть нативным, т.е. определенным в спецификации языка, менять их, добавлять или удалять
могут разработчики когда издают новую спецификацию (или редкие гении которые используют прототип).
Назначение нативных методов - это манипуляции над самим объектом, тогда как свойства присвоенные объекту проедназначены
быть доступными и обработанными другими объектами, функциями и т. д.
добавляя свойство через прототип вы ставите его в один ряд с нативными , такими как методы
defineGetter__defineSetter____lookupGetter____lookupSetter__constructor, hasOwnPropertyis, PrototypeOfproperty,
IsEnumerabletoLocaleString, toSource, toString, valueOf
но доступ к ним будет осуществляться через __prototype__, дабы не засорять пространство имен, если у вашего объекта
будет свойство с именем а и в прототипе будет храниться свойство или метод с таким-же именем, чтобы интерпретатор понимал к какому а
вам сейчас давать доступ.