Я на всякий случай повторюсь - НЕ НАДО добавлять базовым сущностям новые методы. Единственное исключение - методы, включённые в стандарт, но не поддерживаемые старыми браузерами.
Ответы на первый и второй вопрос - нет (по крайней мере, мне сей способ неизвестен). У методов и полей есть скрытое свойство 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 свойства объекта