[英]Is closure in javascript comparable to an instance of a class(which has a private member and a public method) in c++?
[英]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
內部定義的,因此形成一個閉包,但是method1
在Student
范圍之外聲明。
將一個函數分配給另一個函數的原型不能使其訪問其局部變量。
考慮以下示例:
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.