// 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”。
我的理解是怎么回事?
感谢您的帮助。
答案 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而不是印度
再次声明它是指正确的范围
有关代码的详细信息和改进,请参阅here和here。
答案 1 :(得分:2)
实例上的getLover
属性引用您在Man
构造函数中定义的闭包。 lover
内的Man
局部变量是该函数的范围内变量。您在lover
中声明的Indian
变量与Man
内声明的变量没有任何关系,只不过在其他函数内声明的局部变量。
要Indian
操纵lover
内的私有Man
变量,您必须通过访问者函数给Indian
一些访问权限 - 但随后一切都会能够通过相同的访问器功能进行更改。
答案 2 :(得分:1)
我的建议:摆脱这整个特权方法的废话,不要试图将概念从一种语言转换为另一种语言。
出于性能原因,方法应该驻留在原型中。否则,必须为每个实例创建一个新的函数对象(它在构造函数的局部变量上形成一个闭包),这是非常低效的。
如果要隐藏属性(即“私有”字段),请在其名称中添加_private_
之类的前缀,并告诉程序员不要做愚蠢的事情。