我正在學習JS原型。子類不能調用其父類的原型方法
從Java
語言點我期望,SpecificRectangle
對象將有權訪問area()
方法,由於area()是其父類(Rectangle類)原型的方法。
function Rectangle(w,h){
this.width = w;
this.height=h;
}
Rectangle.prototype.area = function(){return this.width*this.height}
function SpecificRectangle(w,h,angle){
Rectangle.call(this,w,h);
SpecificRectangle.prototype=new Rectangle();
}
var specrec = new SpecificRectangle(7,8,45);
所有的一切我不能SpecificRectangle
實例調用area()
方法。
標準JS錯誤有:
TypeError: specrec.area is not a function
[Break On This Error] specrec.area()
什麼解釋,這種封裝的原因是什麼?
不錯,工作正常 – sergionni 2011-12-28 13:28:29
你不應該使用'SpecificRectangle.prototype = new Rectangle()'。它工作很多次,但原則上是不正確的。如果你有ES5,你應該使用'SpecificRectangle.prototype = Object.create(Rectangle.prototype)'來代替,如果你不能保證ES5,你應該像'function create(proto){function f(){} f一樣定義create。原型=原型;返回新的f(); }'併發出'SpecificRectangle.prototype = create(Rectangle.prototype)'。問題是,原型不應該是超類的初始實例,它應該只是從原型繼承而不實際初始化。 – 2011-12-28 14:16:51
感謝您的評論。這導致我閱讀這篇關於你所描述的問題的文章(http://www.bennadel.com/blog/2180-Your-Javascript-Constructor-Logic-May-Break-Prototypal-Inheritance.htm) [第](HTTP://www.bennadel。com/blog/2184-Object-create-Improves-Based-Inheritance-In-Javascript-It-Doesn-t-Replace-It.htm)在Object.create(閱讀註釋)。 – 2011-12-28 14:34:55