В JavaScript у нас есть несколько способов получить свойства объекта, в зависимости от того, что мы хотим получить.
1) Object.keys()
, который возвращает все собственные перечислимые свойства объекта, метод ECMA5.
2) for...in
цикл, который возвращает все перечисляемые свойства объекта, независимо от того, являются ли они собственными свойствами или унаследованы от цепочки прототипов.
3), Object.getOwnPropertyNames(obj)
который возвращает все собственные свойства объекта, перечислимые или нет.
У нас также есть такие методы, которые hasOwnProperty(prop)
позволяют нам проверять, унаследовано ли свойство или действительно принадлежит этому объекту, и propertyIsEnumerable(prop)
которые, как следует из названия, позволяют нам проверять, является ли свойство перечислимым.
Со всеми этими опциями невозможно получить неперечислимое, не принадлежащее мне свойство объекта, что я и хочу сделать. Есть какой-либо способ сделать это? Другими словами, можно как-нибудь получить список унаследованных неперечислимых свойств?
Спасибо.
источник
Ответы:
Поскольку
getOwnPropertyNames
вы можете получить неперечислимые свойства, вы можете использовать это и комбинировать с переходом по цепочке прототипов.Я протестировал это на Safari 5.1 и получил
Обновление: немного переработан код (добавлены пробелы и фигурные скобки, а также улучшено имя функции):
источник
while(curr = Object.getPrototypeOf(cure))
поскольку в условном выражении используется оператор присваивания вместо оператора сравнения, не всегда ли он возвращает true? Или эта строка по существу проверяет, есть ли у curr прототип?Object.getPrototypeOf(cure)
возвратеnull
в верхней части цепочки прототипов. Я предполагаю, что это не предполагает никаких круговых цепочек прототипов!Function.prototype
никогда не может быть "корневым" прототипом, поскольку ссылка на прототип указывает наObject.prototype
. ФункцияObject.getPrototypeOf( obj )
возвращает самый верхний объект в цепочке прототиповobj
. Это позволяет вам следовать цепочке прототиповobj
до ее конца (null
значения). Я не уверен, в чем твоя проблема ...undefined
.Object.getPrototypeOf(John)
возвращаетBoy.prototype
объект (как и должно) - см. здесь: jsfiddle.net/aeGLA/1 . Обратите внимание, что конструктор неBoy
входит в цепочку прототипов . Прототипом цепочка выглядит следующим образом : .John
John
Boy.prototype -> Object.prototype -> null
John
, его конструктор - этоBoy
, аprototype
свойствоBoy
-Boy.prototype
. Итак,Object.getPrototypeOf(John)
возвращаетсяBoy.prototype
.Более чистое решение с использованием рекурсии:
редактировать
Более общие функции:
Этот же шаблон можно применить, используя
Object.getOwnPropertySymbols
и т. Д.источник
Использование наборов приводит к несколько более чистому решению, IMO.
источник
Прямая итерация в ES6:
Пример выполнения:
Показать фрагмент кода
источник
Чтобы получить все унаследованные свойства или методы для некоторого экземпляра, вы можете использовать что-то вроде этого
источник
Object.getInherited
, чемObject.prototype.getInherited
. Это также устраняет необходимость в уродливой!(name == 'getInherited')
проверке. Кроме того, в вашей реализацииprops
массив может содержать повторяющиеся свойства. И наконец, какова цель игнорированияconstructor
свойства?Вот решение, которое я придумал, изучая предмет. Чтобы получить все неперечислимые не собственные свойства
obj
объекта, выполнитеgetProperties(obj, "nonown", "nonenum");
источник
Пример использования:
источник
если вы пытаетесь зарегистрировать неперечислимые свойства родительского объекта ex. по умолчанию методы, определенные внутри класса в es6, устанавливаются в прототипе, но не являются перечисляемыми.
источник
Реализация в моих личных предпочтениях :)
источник