2013-06-04 3 views
1

Мне показалось, что я понял объект прототипа javascript и как его использовать, но теперь я столкнулся с чем-то, что немного озадачило меня. При попытке запустить код ниже mpo.testFire() пожаров без проблем, но я получаю ошибку Uncaught TypeError: Объект # не имеет метода «fireAlert» при попытке вызвать mpo.fireAlert() который я думал, была часть прототипа:Вызов метода прототипа из родительского объекта не работает

<body> 
    <a href="#" id="testBtn">Click Me</a> 
</body> 

// Click handler, create new object 
// call parent method and prototype method 
$("#testBtn").click(function(e) { 
    e.preventDefault(); 
    var mpo = new Myobject(); 
    mpo.testFire(); 
    mpo.fireAlert(); 
}); 

Myobject = function() { 
    var testFire = function() { 
     alert('testFire'); 
    }; 

    return { 
     testFire:testFire 
    }; 
}; 

Myobject.prototype = function() { 
    var fireAlert = function() { 
     alert('made it to fireAlert'); 
    }; 

    return { 
     fireAlert:fireAlert 
    }; 
}(); 

Если изменить код и перевести все в прототип объекта как код ниже все работает, как ожидалось:

$("#testBtn").click(function(e) { 
    e.preventDefault(); 
    var mpo = new Myobject(); 
    mpo.testFire(); 
    mpo.fireAlert(); 
}); 

Myobject = function() { 
    // constructor logic here maybe? 
}; 

Myobject.prototype = function() { 
    var fireAlert = function() { 
     alert('made it to fireAlert'); 
    }; 

    var testFire = function() { 
     alert('testFire'); 
    }; 

    return { 
     fireAlert:fireAlert, 
     testFire:testFire 
    }; 
}(); 

Я предполагаю, что есть проблема сферы, так как в первом примере, я возвращаю интерфейс от родительского объекта , Может ли кто-нибудь объяснить, почему первый пример не работает?

+0

здесь есть несколько jquery, и вопрос должен быть помечен как таковой. – imulsion

+0

@imulsion спасибо, я добавил тэг jquery. – Dropzilla

+1

Вопрос в том, что касается ядра JavaScript, он не имеет никакого отношения к jQuery вообще – 0xor1

ответ

2

Вы возвращаете объектный литерал из первой реализации конструктора MyObject, который ничего не знает о цепочке прототипов MyObject является частью. Во второй реализации пустой конструктор возвращает новый контекст, который был создан, который фактически является объектом MyObject, который знает о соответствующей цепочке прототипов.

+0

спасибо, что этот ответ дал мне больше всего смысла. – Dropzilla

1

Вы возвращаете объект буквального

return { 
    testFire:testFire 
}; 

, который «переопределяет» результат от new (потому что это объект. Возвращаясь, к примеру, строковый бы вернуть созданный объект).

Это код ES5 spec 13.2.2.

+0

Спасибо, +1 за документацию, я выбрал @ 0xor1 ответ, потому что это имело больше смысла для меня в первый раз, когда я его читал. Но это хороший ответ. – Dropzilla

Смежные вопросы