[英]JavaScript prototypal inheritance confusion - what am I missing here?
我正在努力學習我之前認為我理解的主題 - JavaScript中的原型繼承。
我有一個jsfiddle, 在這里概述了我的問題
我有一個基礎對象和一個繼承實現。 我希望實現更改基本屬性,並讓基本訪問這些更新的屬性。
任何人都可以指出我哪里出錯了?
值this
,當你調用new cheeseBase()
是你正在使用從里面“切達()”原型的對象,而不是 “切達干酪”的實例。 因此,“saySomething()”函數總是說:“所有的奶酪”,因為它指的是“捕獲” this
從構造函數調用。
如果您在“alert()”調用中更改“saySomething()”以引用“this.favoriteCheese”,則會在彈出窗口中顯示“cheddar”。
如果你真的希望子類修改基礎對象,或者你可以重新排列:
function cheesebase() {
var that = this;
this.favouriteCheese = "all cheese";
this.setBaseCheese = function(chz) {
that.favouriteCheese = chz;
};
this.saySomething = function() {
alert("My favourite cheese is " + that.favouriteCheese);
};
}
function cheddar() {
var returnObject = Object.create(new cheesebase());
returnObject.setBaseCheese("cheddar");
returnObject.saySomethingElse = function() {
alert("I like cheese");
};
return returnObject;
}
也許你想要實現的是: http : //jsfiddle.net/yrU6y/1/
無論如何,在您的原始示例中,您沒有使用基礎對象的原型。 這意味着每次你創建一個新的cheesebase
你都會重新定義它的函數,即每個cheesebase
對象都有自己的函數,而不是共享原型(並使用更少的內存)。
我最好的猜測,以下代碼會導致問題。
var that = this;
我的原始直覺(不參考JS規范),它基於原型的繼承是基於原型對象的單個實例,而不復制這個對象。 所以, cheeseBase
this
指針指向原型對象,應該永遠不會改變。
后代方法和屬性綁定,在尋找方法或屬性時迭代[this,this.prototype,this.prototype.prototype,...]序列,其中每個原型a意味着是不可變的單例對象。
鑒於此, cheeseBase
構造具有this
指向實際原型,存儲這個里面的指針that
和周圍創建封閉that
,這就是原型對象。
並且,在執行cheeseBase
綁定期間, this
更改為實際對象實例。
我想這樣的東西,可以在JS規范中的這個綁定下找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.