#javascript
Вопрос:
Я хотел бы иметь возможность вызывать keys()
values()
, и items()
непосредственно на объекте , в качестве своего рода краткой формы Object.keys|values|entries(...)
. Вот что у меня есть на данный момент:
let o = { a: 1, b: 2, keys() {return Object.keys(this)}, values() {return Object.values(this)}, items() {return Object.entries(this)} }; for (let k of o.keys()) console.log(k); for (let v of o.values()) console.log(v); for (let [k,v] of o.items()) console.log(k,v);
Кажется, он получает то, что я хочу, за исключением того, что я не хочу, чтобы это свойство было перечисляемым. Две вещи, связанные с этим:
- Каков был бы правильный способ сделать элемент неисчислимым (только так
a
иb
отображаться в качестве ключей)? Будет ли достаточно следующего?for (let prop of ['keys', 'values', 'items']) Object.defineProperty(o, prop, {enumerable: false}) // or ['keys','values','items'].forEach((prop,idx) =gt; Object.defineProperty(o, prop, {enumerable: false}));
- Будет ли вышесказанное (то, что я считаю удобным методом) считаться плохой идеей, и если да, то почему?
Комментарии:
1. Я понимаю, что вы хотите добавить свойство к этому объекту, чтобы вы могли легко получать ключи и значения, но я думаю, что лучший способ-это просто использовать записи объектов, подобные этому:
for(const [key, value] of Object.entries(o)){console.log(key,value)}
2. @MatiasCoco понял, мне просто интересно, есть ли у этого реальный недостаток.
3. я не думаю, что это лучший способ, потому что вам нужно удалить ключи «ключ», «значения» и «элементы» из ключа «ключи» объекта. это сбивает с толку, и если вы работаете со многими объектами, это может замедлить работу вашего кода
4. @Bergi да, и это сработало. Я имел в виду, будет ли это работать и будет ли достаточно для моих целей-я новичок в JS и хочу убедиться, что он работает не только на консоли. журнал выглядит нормально».
5. » Будет ли это считаться плохой идеей? «…вероятно, да. Если вы используете объект в качестве записи, вам не нужно его повторять. Если вы используете объект в качестве словаря произвольных ключей, вы не можете зарезервировать
keys
,values
entries
например, методы. Только в нескольких отдельных случаях с произвольными ключами этот шаблон был бы разумным. Тем не менее, просто используйтеMap
вместо этого.
Ответ №1:
Вы можете добавить вспомогательные методы в объект Object.prototype (в основном родительский объект всех объектов javascript), чтобы все объекты имели .keys()
, .values()
, и .entries()
методы.
const obj = { a: 1, b: 2 }; for (let prop of ['keys', 'values', 'entries']) { Object.defineProperty(Object.prototype, prop, { enumerable: false, value: function() { return Object[prop](this); } }); } console.log(obj); console.log(obj.keys()); console.log(obj.values()); console.log(obj.entries());
Ответ №2:
Вы можете отредактировать методы прототипа, чтобы изменения были глобальными.
Object.prototype.keys = function(){ return Object.keys(this); } Object.prototype.entries = function(){ return Object.entries(this); } Object.prototype.values = function(){ return Object.values(this); } const test = { name: "bob" }; console.log({ keys: test.keys(), values: test.values(), entries: test.entries(), });