Как добавить метод в стандартный объект 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] } // f return this } else var oObject = this return oObject.flip() } // i }; // fli })() } // i var oObject = {1:"a", 2:"b", 3:"c"} for(var k in oObject)if(oObject.hasOwnProperty(k)) log(k); // a, b, c, fli } // 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: fals })
const oObject = {1: "a", 2: "b", 3: "c"} for (let k in oObject) if (oObject.hasOwnProperty(k)) console.log(k); // a, b,
Для того чтобы скрыть добавленный метод при переборе объекта, можно использовать специальный символ 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: fals
})
const oObject = {1: "a", 2: "b", 3: "c"}
for (let k in oObject)
if (oObject.hasOwnProperty(k))
console.log(k); // a, b,
console.log(Object.getOwnPropertySymbols(Object.prototype)); // [Symbol(flip)]
Теперь метод flip не будет отображаться при обычном переборе объекта, но он доступен для использования как метод объекта через символ Symbol.