Я, например, не полностью против расширения нативных типов и ECMA-262 5-е издание . хорошо решает проблемы, упомянутые в других ответах и связанных статьях для нас. Посмотрите эти слайды для хорошего обзора.
Вы можете расширить любой объект и определить дескрипторы свойств, которые управляют поведением этих свойств. Свойство может быть сделано не перечисляемым, что означает, что при доступе к свойствам объектов в цикле for..in
это свойство не будет включено.
Вот как вы можете определить метод getType
для самого Object.prototype и сделать его не перечисляемым:
Object.defineProperty(Object.prototype, "getType", {
enumerable: false,
writable: false,
configurable: false,
value: function() {
return typeof this;
}
});
// only logs "foo"
for(var name in { "foo": "bar" }) {
console.log(name);
}
Функция getType
, приведенная выше, в основном бесполезна, поскольку она просто возвращает typeof object
, который в большинстве случаев будет просто объектом, но он только для демонстрации.
[].getType();
{}.getType();
(6).getType();
true.getType();