переименовать hasOwnProperty, но запретить перечисление - PullRequest
2 голосов
/ 09 ноября 2011

Мне приходится много использовать hasOwnProperty в моем коде, и он раздражающе длинный и печатается на верблюжьей шкуре. Я хотел иметь возможность просто сказать myObj.has('x'), но когда я попытался создать псевдоним для hOP в Object.prototype 'has', теперь он перечисляется в циклах for..in. Каков наилучший способ получить то, что я хочу? Я имею в виду, что я мог бы просто создать глобальную функцию, которая работает как has(obj, prop), но мне больше нравится формат точек, и я хотел бы знать, какие хитрости может иметь javascript, поэтому я ищу предложения.

Обновление: это выглядит довольно глупо, но String.prototype.in = function(obj){return obj.hasOwnProperty(this)} ОК? После этого я могу сказать if ( 'x'.in(myObj) ) {... К сожалению, он добавляет еще один уровень вызова функции, а не просто создает псевдоним hasOwnProperty, но мне нравится синтаксис.

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Вы можете запретить перечисление только в ES5-совместимых браузерах, используя Object.defineProperty():

Object.defineProperty(myObj, "has", { value: Object.prototype.hasOwnProperty });

defineProperty() по умолчанию для установки не перечисляемых свойств.Лучшим подходом ES3 было бы просто создать псевдоним функции и не привязывать ее к Object.prototype:

var has = function (ob, prop) { 
    return Object.prototype.hasOwnProperty.call(ob, prop); 
}

Я не вижу ничего плохого и в вашем собственном подходе String.prototype.in, за исключением, возможно, потенциальногоназывать коллизии в будущем, но это ваш звонок.Вызов его String.prototype.on устранит неоднозначность с оператором in.

1 голос
/ 09 ноября 2011

Это должно сработать

Object.prototype.has = function(x) {
  return this.hasOwnProperty(x)
}

Будьте осторожны при использовании SomeNativeThing.prototype и используйте

if ((typeof Object.prototype.has) !== 'function') {
   ...
}

чтобы вы ничего не переопределяли

как утверждает @pomeh, использование Object.prototype.has = Object.prototype.hasOwnProperty намного лучше

...