我有以下设置。方法和方法1都是Student类的公共方法。但为什么只有“方法”访问私有变量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();
它是如何理解的,我的意思是它是“一种无法访问私人成员的公共方法!”
答案 0 :(得分:4)
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
,它是一个特殊的关键字。所有其他变量都通过范围链严格定义。
答案 1 :(得分:0)
method1是在Student的基类定义之外定义的。因此,它无法访问基类定义中声明为private的变量。如果可以,那么你可以通过为该类定义一个公共方法来解决现有类中的私有变量限制。
答案 2 :(得分:0)
在JavaScript中,method1
等公共方法(即添加到原型中的方法)无权访问私有变量,但是method
等“特权”方法可以访问。
请记住,JavaScript与其他面向对象语言没有相同的范围规则。 method
方法围绕Student
构造函数中的私有变量形成闭包,而method1
则不然。