我一直在學習約翰Resig的JavaScript原型繼承JavaScript忍者的祕密,我想知道在下面的代碼示例(我剛剛編寫)中會發生什麼。這是JavaScript的原型繼承模型的缺陷嗎?
function Person() {}
Person.prototype.sayHello = function() {
alert("Hello World");
}
function Ninja() {}
Ninja.prototype.swingSword = function() {
alert("I can swing my sword.");
}
Ninja.prototype = new Person();
var ninja1 = new Ninja();
據我所知,所有的這些代碼行的結果是,可變ninja1
引用一個Ninja
對象,即通過其原型,具有swingSword
方法,並通過Person
的原型繼承原型,有sayHello
方法。
我的困惑是在以下幾點:因爲屬性swingSword
(這恰好是一個方法)連接到Ninja
的原型前一個人的實例被分配到Ninja
的原型,會不swingSword
屬性/方法被後續賦值的Person
實例覆蓋?如果不是,Ninja
的原型屬性如何引用原型對象,請參考Person
實例,和都有swingSword
屬性?
你運行該代碼?是什麼讓你覺得'ninja1'既有'sayHello'也有'swingSword'? –
當你做'Ninja.prototype = new Person();'時,Ninja的原型被完全覆蓋。而'ninja1'在這個結尾處不會有swingSword方法。這不是做原型繼承的方法。 – RoryKoehein
對於不強制創建其父(新人)實例的繼承,您可以使用'Ninja.prototype = Object.create(Person.prototype);'或輔助函數。更多關於這裏的構造函數:http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711你沒有使用特定於實例的成員,但是如果你這樣做,你應該做'Person.call(this );'在忍者構造函數體中(見鏈接)。 – HMR