// 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”。
我的理解是怎么错了?
谢谢你的帮助。
首先你的代码不能在所有的工作,这是错误的。
下面是工作的代码:
// 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是指男人,而不是印度的封闭。
再次声明它,它指的是正确的范围。
见这里和这里进一步的细节和你的代码的改进。
该getLover
在实例属性指的是你中定义的封Man
构造。 在lover
内局部变量Man
是一个在范围内该功能。 在lover
你内声明的变量Indian
并没有任何关系做内声明的一个Man
,不超过局部变量声明内的其他功能做。
对于Indian
操纵私人lover
内部变量Man
,你就必须给Indian
通过访问函数一些访问它-但后来一切都将能够通过相同的存取函数去改变它。
我的建议是:摆脱这种全priviledged方法的废话,也不要试图从一种语言鞋拔子概念转化为另一种。
出于性能的考虑,方法应该驻留在原型。 否则,一个新的函数对象(形成了构造函数的局部vaiables闭包)必须为每个实例,这是非常低效的创建。
如果你想隐藏的属性(即“私人”领域),如添加前缀_private_
他们的名字,并告诉程序员不要做愚蠢的事情。