如何在javascript中覆盖私有变量?

时间:2009-09-17 09:27:35

标签: javascript oop

// base function
function Man(name) {
  // private property
  var lover = "simron";
  // public property
  this.wife = "rocy";
  // privileged method
  this.getLover = function(){return lover};
  // public method
  Man.prototype.getWife = function(){return this.wife;};
}

// child function
function Indian(){
  var lover = "jothika"; 
  this.wife = "kamala";
}

Indian.prototype = aMan;
var aMan = new Man("raja");
oneIndian = new Indian();
oneIndian.getLover();

我的答案是“simron”,但我期待“jothika”。

我的理解是怎么回事?

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

首先,你的代码根本不起作用,这是错误的 这是有效的代码:

// base function
function Man(name) {
  // private property
  var lover = "simron";
  // public property
  this.wife = "rocy";
  // privileged method
  this.getLover = function(){return lover};
  // public method
  Man.prototype.getWife = function(){return this.wife;};
}

// child function
function Indian(){
  var lover = "jothika"; 
  this.wife = "kamala";
  this.getLover = function(){return lover};
}

Indian.prototype = new Man();
Indian.prototype.constructor = Indian;

var oneIndian = new Indian();
document.write(oneIndian.getLover());
直到你宣布它为止,aMan才存在 你也应该把ctor设置为印度人 最后,getLover是一个封闭,指的是Man而不是印度 再次声明它是指正确的范围 有关代码的详细信息和改进,请参阅herehere

答案 1 :(得分:2)

实例上的getLover属性引用您在Man构造函数中定义的闭包。 lover内的Man局部变量是该函数的范围内变量。您在lover中声明的Indian变量与Man内声明的变量没有任何关系,只不过在其他函数内声明的局部变量。

Indian操纵lover内的私有Man变量,您必须通过访问者函数给Indian一些访问权限 - 但随后一切都会能够通过相同的访问器功能进行更改。

答案 2 :(得分:1)

我的建议:摆脱这整个特权方法的废话,不要试图将概念从一种语言转换为另一种语言。

出于性能原因,方法应该驻留在原型中。否则,必须为每个实例创建一个新的函数对象(它在构造函数的局部变量上形成一个闭包),这是非常低效的。

如果要隐藏属性(即“私有”字段),请在其名称中添加_private_之类的前缀,并告诉程序员不要做愚蠢的事情。