Как перенести контекст в свойство класса

183
13 ноября 2021, 01:20

Мне нужно расширить класс, чтобы можно было делать так:

[1, 2, 3].property.containsKey('0')

Нужно именно для объекта проверять, есть ли ключ.

Особенность в том, что нельзя создать новый объект, нужно именно расширить базовый.

Я написал код ниже, но this оказывается равным undefined.

Как добиться правильной работы?

Object.prototype.property = {
   containsKey: (key) => {
   return key in this;
   }
};
Answer 1

В приведенном коде, добиться "правильной" работы не получится, так как нет возможности получить объект, по свойству.

Поэтому самое простое решение - убрать лишнюю прослойку .property

Object.prototype.containsKey = function(key) { 
  return key in this; 
}; 
console.log([1, 2, 3].containsKey('0'))

Если прослойка зачем-то нужна, то можно объявить getter с помощью Object.defineProperty

Object.defineProperty(Object.prototype, 'property', { 
  get: function() { 
    return { 
      containsKey: (key) => key in this 
    }; 
  } 
}); 
console.log([1, 2, 3].property.containsKey('0'))

READ ALSO
Искажение ссылок фиксированной частью NavLink JS

Искажение ссылок фиксированной частью NavLink JS

Использую NavLink для формирования адресной строкиВ одной из компонент url формируется по шаблону:

73
Ответ с php в js (ajax) без json

Ответ с php в js (ajax) без json

сделал аяксом запрос на покупку тарифплана на сайте, дополнительно захотелось выполнить валидацию на сервере (например если введенная сумма...

114
Свой шаблон в SuggestView - Яндекс карта

Свой шаблон в SuggestView - Яндекс карта

Как создавать свой шаблон в SuggestView я понял, но как вывести данные от SuggestView в шаблоне - я так и не понял

180