我有这个代码块将创建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; }
更新,删除小提琴,发布不正确的。
答案 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 =" ...")将是一个字符串。 希望它有所帮助。