3
function Resource(){ 
    var id = '';

    this.getId = function(){
        return id;
    }

    this.setId = function(value){
        id = value;
    }
}

function Model(){ } 
Model.prototype = new Resource();

为了测试上面的代码,我有以下内容:

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

我希望收到以下警报:m1 = blah, m2 = blahblah, m1 = blah.

但是,正在显示以下内容:m1 = blah, m2 = blahblah, m1 = blahblah

我已经编写了上面的代码作为实验,以便我可以开始理解 JavaScript 中的继承。也许我对应该显示的内容的期望是由于我的 Java/C# 背景。显然,创建的每个新模型对象共享资源中定义的相同id变量。为什么是这样?

我怎样才能写这个,以便每个新模型都可以拥有自己的独特id性(除了显而易见的 - 在模型中定义)?

顺便说一句,我故意将 id 定义为var id而不是this.id,因为我正在寻找私有变量行为。

4

2 回答 2

3

原型对象在所有实例之间共享。

因为id变量属于Resource构造函数,并且因为prototypeofModel是 的单个实例Resource,所以所有Model实例都使用该单个实例,因此是同一个变量。

对于每个Model实例都有自己的id变量,您需要在构造函数以及访问器方法中创建id变量。Model

function Model() {
    var id = '';

    this.getId = function(){
        return id;
    }

    this.setId = function(value){
        id = value;
    }
}

实现此目的的另一种方法是Resource使用实Model​​例作为上下文来调用。这是使用.call.apply这样完成的:

function Model() {
    Resource.apply(this);
}

这将调用该Resource函数,该函数将创建id变量及其访问器方法,但访问器将分配给Model实例。

于 2012-10-01T15:41:57.680 回答
0

这只是一个范围问题,我指定我们正在谈论this.id而不是仅仅id在你的 get / set 方法中,它工作得很好:

this.getId = function(){
  return this.id;
}

this.setId = function(value){
  this.id = value;
}

这是一个小提琴:http: //jsfiddle.net/thewebguy/zHDwC/

于 2012-10-01T15:42:18.913 回答