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;
}