在Javascript中返回MyClass的ID

时间:2016-01-31 20:51:47

标签: javascript closures

我有这个代码块将创建MyClass的新实例,我希望这个类的每个实例都有一个id。所以我有一个函数将返回cnt,每次初始化新对象时,id值都会增加。

var MyClass = (function () {
    var Constr, cnt = 0;

    Constr = function () {};    
    Constr.id = function () {
    return cnt;
    };

    Constr.prototype = {
        constructor: Constr, 
        id: Constr.id
    };
    cnt++
    return Constr;
}());

var x = new MyClass();
console.log(x.id);
document.getElementById("1").innerHTML = x.id;

问题是,我显然希望返回cnt的值,但我所做的一切都会返回function() { return cnt; }

更新,删除小提琴,发布不正确的。

3 个答案:

答案 0 :(得分:1)

如果希望每个实例都具有唯一值,则需要在实例的构造函数中设置该值。

您无法继承原型链上的值。当你希望每个对象具有相同的值时,这就是你所做的。

您还需要指定所需的值,而不是将返回值的函数。

Constr = function () {
    this.id = cnd;
};

答案 1 :(得分:1)

如果您希望为每个新类实例唯一分配id,则需要在Const构造函数中为您的实例数据分配id:

var MyClass = (function () {
    var cnt = 0;

    // constructor for our object    
    function Constr() {
        // assign a unique id to this object when it is created
        this.id = cnt++;
    };

    // static method (not an instance method) - get current global cnt value 
    Constr.id = function () {
       return cnt;
    };

    Constr.prototype = {
        constructor: Constr, 
    };
    return Constr;
}());

var x = new MyClass();
console.log(x.id);
document.getElementById("1").innerHTML = x.id;

这个问题表明,或许你并没有真正了解my comments on your earlier question外部函数只被调用一次。我建议你重读那些。

当你这样做时:

x = new MyClass()

它只执行Constr函数,没有别的。另外,.prototype在所有实例之间共享(这是它的重点),因此您永远不能在那里放置一个对每个实例都唯一的计数器。

答案 2 :(得分:-1)

看起来你需要的只是:

var MyClass = (function () {
    var cnt = 0;

    function Constr() {
      this.id = cnt++;
    };    

    Constr.prototype = {
      constructor: Constr
    };

    return Constr;
}());

以下是我之前的BAD答案,

您可以将Constr.id替换为:

....
Constr.id = new function () {
  this.toString = function () {
    return ++cnt;
  }
};
....

然后你应该从

的实例中获取它
var x = new MyClass();
console.debug(x.id);

但请注意它将是一个对象,并且仅当用作字符串时(如在console.debug中,或者使用.innerHTML =" ...")将是一个字符串。 希望它有所帮助。