簡體   English   中英

JavaScript原型繼承混亂 - 我在這里缺少什么?

[英]JavaScript prototypal inheritance confusion - what am I missing here?

我正在努力學習我之前認為我理解的主題 - JavaScript中的原型繼承。

我有一個jsfiddle, 在這里概述了我的問題

我有一個基礎對象和一個繼承實現。 我希望實現更改基本屬性,並讓基本訪問這些更新的屬性。

任何人都可以指出我哪里出錯了?

this ,當你調用new cheeseBase()是你正在使用從里面“切達()”原型的對象,而不是 “切達干酪”的實例。 因此,“saySomething()”函數總是說:“所有的奶酪”,因為它指的是“捕獲” this從構造函數調用。

如果您在“alert()”調用中更改“say​​Something()”以引用“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM