gpt4 book ai didi

javascript - John Resig 的简单类模式的静态变量?

转载 作者:搜寻专家 更新时间:2023-11-01 05:25:11 25 4
gpt4 key购买 nike

我指的是 this article .

在其中,他定义了一个看起来像这样的函数:

function makeClass() {
return function _class() {
if(this instanceof _class) {
if(typeof this.init === 'function') {
this.init.apply(this, arguments);
}
} else {
throw new Error('Constructor called as a function');
}
};
}

然后你可以像这样使用它:

var MyClass = makeClass();

MyClass.prototype = {
init: function(width, height) { ... },
clear: function(ctx) {... },
draw: function(ctx) { ... }
}

但现在我想初始化一些应该在所有实例之间共享的静态变量。我该怎么做?

最佳答案

嗯,最简单的方法是定义一个静态变量作为原型(prototype)属性:

MyClass.prototype.xxx: 3, // ...
var t1 = new MyClass();
console.log(t1.xxx); // 3

...但它不会像其他语言中的静态属性那样表现:

var t2 = new MyClass();
t2.xxx = 5;
console.log(t1.xxx); // still 3 :(

另一种方法是利用属性也可以附加到函数这一事实:

MyClass.xxx = 3;

...但这缩小了我们使用此属性的方式(它不能被前面示例中的 t1.xxx 调用)。

不过,还有另一种方法。可以将静态属性定义为变量,局部于 init 方法,可通过方法访问,定义...也在此 init 方法中。 ) 像这样。

   init: function() {
var xxx = 3;
MyClass.prototype.getXXX = function() {
return xxx;
};
MyClass.prototype.setXXX = function(newXXX) {
xxx = newXXX;
}
}

然后所有人都可以通过这个简单地使用这个属性:

  var t1 = new MyClass();
var t2 = new MyClass();
console.log(t1.getXXX()); // 3
console.log(t2.getXXX()); // 3
t1.setXXX(5);
console.log(t1.getXXX()); // 5 now
console.log(t2.getXXX()); // 5 as well, behold the power of closures!

这里是 a fiddle用过。

更新:我想,当我们需要使用静态类数据的(某种)容器时,最好使用这种方法,该容器将由所有对象共享 - 但我们不确切知道是什么实际上可以存储在这个容器中。然后我们只使用两个函数 - getStaticsetStatic - 通过字符串键或其他一些标识符来存储和检索数据。这可能看起来有点令人困惑,确实如此,但我认为这可能值得努力。 )

关于javascript - John Resig 的简单类模式的静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11172801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com