javascript:具有继承的基本对象中变量的行为
为了测试上述代码,我有以下几点:javascript:具有继承的基本对象中变量的行为,javascript,Javascript,为了测试上述代码,我有以下几点: function Resource(){ var id = ''; this.getId = function(){ return id; } this.setId = function(value){ id = value; } } function Model(){ } Model.prototype = new Resource(); 我希望以下消息会被提醒:m1=blah
function Resource(){
var id = '';
this.getId = function(){
return id;
}
this.setId = function(value){
id = value;
}
}
function Model(){ }
Model.prototype = new Resource();
我希望以下消息会被提醒:m1=blah,m2=blahblah,m1=blah
但是,将显示以下内容:m1=blah,m2=blahblah,m1=blahblah
我编写了上述代码作为一个实验,以便开始理解JavaScript中的继承。也许我对应该显示什么的期望是由于我的Java/C背景。显然,创建的每个新模型对象共享资源中定义的相同id
变量。为什么会这样
我如何编写它,使每个新模型都有自己独特的id
(模型中的明显定义除外)
顺便说一句,我特意将id定义为
var id
,而不是this.id
,因为我正在寻找私有变量行为。所有实例之间共享一个原型对象
由于id
变量属于资源
构造函数,并且模型
的原型
是资源
的单个实例,因此所有模型
实例都使用该单个实例,因此使用相同的变量
为了使每个模型
实例都有自己的id
变量,您需要在模型
构造函数中创建id
变量以及访问器方法
var m1 = new Model();
m1.setId("blah");
alert("m1 = " + m1.getId());
var m2 = new Model();
m2.setId("blahblah");
alert("m2 = " + m2.getId());
alert("m1 = " + m1.getId());
另一种方法是使用模型
实例作为上下文调用资源
。这是通过使用来完成的。调用或。像这样应用:
function Model() {
var id = '';
this.getId = function(){
return id;
}
this.setId = function(value){
id = value;
}
}
这将调用Resource
函数,该函数将创建id
变量及其访问器方法,但访问器将分配给模型
实例。这只是一个范围问题,我指定我们在get/set方法中讨论的是this.id
,而不是id
,它非常有效:
function Model() {
Resource.apply(this);
}
这里有一个小问题:这会暴露id
,这使得本地访问器变得不必要。原始代码通过仅允许通过访问器方法访问来保护id
。谢谢,这正是我想要的。
this.getId = function(){
return this.id;
}
this.setId = function(value){
this.id = value;
}