Показать сообщение отдельно
  #13 (permalink)  
Старый 11.01.2013, 14:56
Аспирант
Отправить личное сообщение для Sanda Посмотреть профиль Найти все сообщения от Sanda
 
Регистрация: 12.10.2012
Сообщений: 90

Я на всякий случай повторюсь - НЕ НАДО добавлять базовым сущностям новые методы. Единственное исключение - методы, включённые в стандарт, но не поддерживаемые старыми браузерами.
Ответы на первый и второй вопрос - нет (по крайней мере, мне сей способ неизвестен). У методов и полей есть скрытое свойство enumerable, отвечающее за то, будет ли данный метод считаться в for..in-цикле. У стандартных объектов все предопределённые методы имеют enumerable = false.
Ответ на третий вопрос. Вернее, сначала комментарий. Именно поэтому и не надо расширять стандартные объекты - порой случаются неожиданные казусы вроде этого (: Касаемо же вывода - нужно взять за правило в любом for..in ставить проверку hasOwnProperty для отсечения "привнесённых" методов/полей.

var greeter = function () {};
//свойство в прототипе родителя
greeter.prototype.greet = function() {alert('Hello');};

var byer = new greeter();
//собственное свойство потомка
byer.bye = function () {alert('Bye'); };

var result1 = "With hasOwnProperty:\n";
for (key in byer){
  if (byer.hasOwnProperty(key)) {
    result1 += key + ': ' + byer[key].toString() + "\n";
  }
}

alert(result1); //выводит только собственные свойства объекта

result2 = "Without hasOwnProperty:\n";
for (key in byer){
  result2 += key + ': ' + byer[key].toString() + "\n";
}

alert(result2); //выводит все enumerable=true свойства объекта
Ответить с цитированием