Какой метод или свойство надо переопределить у класса? let ls = {}
class MemoryStorage {
getItem (name) {
return (name in ls) ? ls[name] : null
}
setItem (name, value) {
ls[name] = value
}
removeItem (name) {
const found = name in ls
if (found) {
delete ls[name]
}
}
clear () {
ls = {}
}
}
const storage = new MemoryStorage()
console.log(Object.keys(window.localStorage)) // выведет массив ключей window.localStorage
console.log(Object.keys(storage)) // выведет пустой массивUPD:class MemoryStorage {
get length () {
return Object.keys(this).length
}
getItem (name) {
return (name in this) ? this[name] : null
}
setItem (name, value) {
this[name] = value
}
removeItem (name) {
const found = (name in this)
if (found) {
delete this[name]
}
}
clear () {
for (const k in this) {
delete this[k]
}
}
}
const storage = new MemoryStorage()
storage.setItem('getItem', 'getItem') // Переопределяется getItem [КАК ИЗБЕЖАТЬ???]
const item = storage.getItem('getItem') // TypeError: storage.getItem is not a function
console.log('item:', item)
storage.removeItem('getItem')
storage.setItem('test', 'test')
console.log('Length:', storage.length)
console.log(Object.keys(storage))
storage.clear()
console.log(Object.keys(storage))
console.log('Length:', storage.length)

21 Авг 2019 в 07:00
223 +1
1
Ответы
1

Для избежания переопределения метода getItem в классе MemoryStorage, необходимо использовать другое имя для хранилища объекта this. Например, можно назвать его _storage и обращаться к нему в методах класса:

class MemoryStorage {
constructor() {
this._storage = {}
}
get length () {
return Object.keys(this._storage).length
}
getItem (name) {
return (name in this._storage) ? this._storage[name] : null
}
setItem (name, value) {
this._storage[name] = value
}
removeItem (name) {
const found = (name in this._storage)
if (found) {
delete this._storage[name]
}
}
clear () {
for (const k in this._storage) {
delete this._storage[k]
}
}
}
const storage = new MemoryStorage()
storage.setItem('getItem', 'getItem') // Не переопределяется getItem
const item = storage.getItem('getItem')
console.log('item:', item)
storage.removeItem('getItem')
storage.setItem('test', 'test')
console.log('Length:', storage.length)
console.log(Object.keys(storage._storage))
storage.clear()
console.log(Object.keys(storage._storage))
console.log('Length:', storage.length)

Теперь метод getItem не будет переопределен при использовании setItem.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир