簡體   English   中英

javascript私有成員無法通過公共方法訪問

[英]javascript private member not accessible through public method

我有以下設置。 method和method1都是Student類的公共方法。 但是為什么只有ca“方法”訪問私有變量p

​function Student() {
    var p = 10;
    this.method = function() {
        document.write(p);
    }; 
};

Student.prototype.method1 = function() {
    document.write('here');
    document.write(p);
};

var s = new Student();
s.method();
s.method1();
​

我的意思是說這是“無法訪問私有成員的公共方法!”

JavaScript的原型繼承沒有魔力。

Student仍然是一個函數, p在該函數中是局部的。 不能以任何方式從外部代碼訪問它。 method可以訪問p因為它是在Student內部定義的,因此形成一個閉包,但是method1Student范圍之外聲明。

將一個函數分配給另一個函數的原型不能使其訪問其局部變量。

考慮以下示例:

var p = 41;

function foo() {
    console.log(p);
}

​function Student(){
    var p = 10;
};

Student.prototype.bar = foo;

var s = new Student();
s.bar();
foo();

您可能會認為,由於foo作為對象方法被調用,因此可以訪問局部變量,但是事實並非如此。 動態確定的唯一值是this ,它是一個特殊的關鍵字。 所有其他變量都是通過作用域鏈嚴格定義的。

method1在學生的基類定義之外定義。 因此,它無法訪問在基類定義中聲明為私有的變量。 如果可以,那么只需為該類定義一個公共方法,就可以解決現有類中的私有變量限制。

在JavaScript中,像method1這樣的公共方法(即添加到原型中的方法)不能訪問私有變量,但是像您的method那樣的“特權”方法卻可以訪問。

請記住,JavaScript與其他面向對象的語言沒有相同的范圍規則。 method方法在Student構造函數中的私有變量周圍形成一個閉包,而method1則沒有。

暫無
暫無

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

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