我正在學習在JavaScript基於原型的OOP最近。閱讀大量的網站解釋JavaScript的原型機制後,我從Mozilla的落戶與Mozilla如果我在JavaScript中創建子類時沒有正確設置構造函數,會出現什麼問題?
下面這種方法是一些片段:
// Shape - superclass
function Shape() {
this.x = 0;
this.y = 0;
}
// superclass method
Shape.prototype.move = function(x, y) {
this.x += x;
this.y += y;
console.info("Shape moved.");
};
// Rectangle - subclass
function Rectangle() {
Shape.call(this); // call super constructor.
}
// subclass extends superclass
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
var rect = new Rectangle();
rect instanceof Rectangle // true.
rect instanceof Shape // true.
rect.move(1, 1); // Outputs, "Shape moved."
我明白Rectangle.prototype = Object.create(Shape.prototype);
將設置原型鏈正常使Rectangle
的實例將繼承Shape
的方法。
但Rectangle.prototype.constructor = Rectangle;
線是有點混亂。
從this website我知道,當我們創建一個像function MyClass(){}
一個新的對象,JavaScript就其原型設置爲空對象和MyClass.prototype.constructor
將指向回MyClass
。所以Rectangle.prototype.constructor = Rectangle;
將修復斷開的鏈接,因爲Object.create(Shape.prototype).constructor
仍指向Shape
。
但如果我刪除此行,我仍然會得到沒有問題運行下面的代碼。如果有構造函數屬性的用例,我只是好奇嗎?如果我把它指向超類,會出現什麼問題?
謝謝你的enumerable部分。這是我從來不知道的事情。我曾嘗試在有或沒有設置構造函數的情況下運行'''rect instanceof Rectangle'''。他們都返回''''''''。你能指出一點點差別嗎? – adieu
對不起@adieu,我錯了'instanceof'操作符。構造函數屬性實際上與'instanceof'無關' –
請注意,當您正確地對其進行多邊形填充時,將第二個參數傳遞給Object.create應該會導致舊版瀏覽器發生錯誤。換一種說法;沒有辦法將第二個參數polyfil Object.create。 – HMR