如何重写私有变量在JavaScript?(How to override private varia

2019-07-18 08:38发布

// 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”。

我的理解是怎么错了?

谢谢你的帮助。

Answer 1:

首先你的代码不能在所有的工作,这是错误的。
下面是工作的代码:

// 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());

祖阿曼是不存在的,直到你宣布它。
另外,应设置构造函数来印度。
而在最后,getLover是指男人,而不是印度的封闭。
再次声明它,它指的是正确的范围。
见这里和这里进一步的细节和你的代码的改进。



Answer 2:

getLover在实例属性指的是你中定义的封Man构造。 在lover内局部变量Man是一个在范围内该功能。 在lover你内声明的变量Indian并没有任何关系做内声明的一个Man ,不超过局部变量声明内的其他功能做。

对于Indian操纵私人lover内部变量Man ,你就必须给Indian通过访问函数一些访问它-但后来一切都将能够通过相同的存取函数去改变它。



Answer 3:

我的建议是:摆脱这种全priviledged方法的废话,也不要试图从一种语言鞋拔子概念转化为另一种。

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

如果你想隐藏的属性(即“私人”领域),如添加前缀_private_他们的名字,并告诉程序员不要做愚蠢的事情。



文章来源: How to override private variable in javascript?