簡體   English   中英

原型函數可以訪問局部變量嗎?

[英]can prototype functions access local variables?

我認為使用.prototype創建的函數應該能夠訪問局部變量。 這是我在說的:

function obj() {
    var a = "String";

    this.innerPrint = function() {
        document.write("<p>" + a + "</p>");
    };
}

obj.prototype.outerPrint = function() {
    document.write("<p>" + a + "</p>");
};

var inst = new obj();
inst.innerPrint();
inst.outerPrint();

我以為會發生這兩個功能將做同樣的事情。 但是實際發生的是,outerPrint無法訪問變量a。 有人可以向我解釋如何在原型函數中獲取本地人。

這是運行此代碼的小提琴: http : //jsfiddle.net/Wryte/mxXzg/

順便說一句,我想使用原型函數,因為對象的每個實例都沒有該函數的副本,但是它們每個都指向同一個函數。

如果您希望變量a在構造函數完成執行后仍可訪問,請將代碼更改為

function obj() {
    this.a = "String";

    this.innerPrint = function() {
        document.write("<p>" + this.a + "</p>");
    };
}

obj.prototype.outerPrint = function() {
    document.write("<p>" + this.a + "</p>");
};

如果您不想提供直接的寫訪問權限,請定義一個getter:

function obj() {
    var a = "String";
    this.getA = function() {
        return a;
    }
    this.innerPrint = function() {
        document.write("<p>" + a + "</p>");
    };
}

obj.prototype.outerPrint = function() {
    document.write("<p>" + this.getA() + "</p>");
};

當聲明“ a”時,它是在obj()函數的詞法范圍內聲明的。 所有實例變量也都需要進行原型設計,因此在var a變量應聲明為this.a

當然,您不能從在第一個函數之外定義的另一個函數訪問一個函數的本地變量。 是否在第一個的prototype屬性中定義了第二個並不重要。 您的每一次調用obj函數定義了一個新的本地a變量,所以你不能避免需要訪問它的函數的單獨副本。

我假設您實際上要求該變量是局部變量,而不是實例屬性,所以一種可能的方法是在函數周圍只有一個薄的局部包裝器:

function obj() {
    var a = "String";

    this.wrapper = function() { outerPrint.call(this, a); }
    this.innerPrint = function() {
        document.write("<p>" + a + "</p>");
    };
}

function outerPrint(a) {
    document.write("<p>" + a + "</p>");
};

再次,我假設您具有一個更復雜的函數來代替outerPrint ,因此通過這種方式,您可以避免重復大型函數,而以最小化包裝程序為代價。 這樣你保留的私有性a變量,而一個公共的getter將允許外部代碼來檢查它的價值。

更新:關於@Bergi,我已經修改了代碼,使outerPrint成為與定義obj構造函數相同的作用域的局部函數。 不再位於原型上,它將不能直接用於obj實例。 請注意,所有代碼都需要在函數范圍內,以避免全局的outerPrint函數。

不,這是一個局部變量。 由於名為prototype的屬性,沒有跳過范圍規則。

該變量只能從構造函數內部定義的函數訪問; 因此,他們被稱為特權 當然,當這些可以作為公共方法訪問時,可以從外部調用它們,即。

Obj.prototype.outerPrint = function() {
    this.innerPrint();
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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