Как добавить метод в стандартный объект JavaScript? Привет! Добавляю метод в стандартный объект Object JavaScript через Object.prototype. Однако, после этого, он становится одним из свойств любого объекта, который появляется при переборе (for in), при этом hasOwnProperty, понятно, не спасает. Как сделать так, чтобы метод был "скрыт" при переборе, не выявлялся как свойство?if(Object.prototype.flip === undefined){ (function(){ Object.prototype.flip = function(bSelf){ if(bSelf === undefined || bSelf){ for(var k in this)if(this.hasOwnProperty(k)){ this[this[k]] = k; delete this[k]; } // fr return this; } else { var oObject = this; return oObject.flip(); } // if }; // flip })(); } // if var oObject = {1:"a", 2:"b", 3:"c"}; for(var k in oObject)if(oObject.hasOwnProperty(k)){ log(k); // a, b, c, flip } // fr
Для того чтобы скрыть добавленный метод при переборе объекта, можно использовать специальный символ Symbol. Вместо добавления метода напрямую в Object.prototype, можно добавить его как свойство объекта, где ключом будет символ Symbol.
Пример:
const flipSymbol = Symbol('flip'); if (!Object.prototype[flipSymbol]) { Object.defineProperty(Object.prototype, flipSymbol, { value: function(bSelf) { if (bSelf === undefined || bSelf) { for (let k in this) { if (this.hasOwnProperty(k)) { this[this[k]] = k; delete this[k]; } } return this; } else { return this.flip(); } }, enumerable: false }); } const oObject = {1: "a", 2: "b", 3: "c"}; for (let k in oObject) { if (oObject.hasOwnProperty(k)) { console.log(k); // a, b, c } } console.log(Object.getOwnPropertySymbols(Object.prototype)); // [Symbol(flip)]
Теперь метод flip не будет отображаться при обычном переборе объекта, но он доступен для использования как метод объекта через символ Symbol.
Для того чтобы скрыть добавленный метод при переборе объекта, можно использовать специальный символ Symbol. Вместо добавления метода напрямую в Object.prototype, можно добавить его как свойство объекта, где ключом будет символ Symbol.
Пример:
const flipSymbol = Symbol('flip');if (!Object.prototype[flipSymbol]) {
Object.defineProperty(Object.prototype, flipSymbol, {
value: function(bSelf) {
if (bSelf === undefined || bSelf) {
for (let k in this) {
if (this.hasOwnProperty(k)) {
this[this[k]] = k;
delete this[k];
}
}
return this;
} else {
return this.flip();
}
},
enumerable: false
});
}
const oObject = {1: "a", 2: "b", 3: "c"};
for (let k in oObject) {
if (oObject.hasOwnProperty(k)) {
console.log(k); // a, b, c
}
}
console.log(Object.getOwnPropertySymbols(Object.prototype)); // [Symbol(flip)]
Теперь метод flip не будет отображаться при обычном переборе объекта, но он доступен для использования как метод объекта через символ Symbol.