var oneArgumentPooler = function(copyFieldsFrom) {
var Klass = this;
if (Klass.instancePool.length) {
// 如果缓存池中有对象,就直接拿出来用
var instance = Klass.instancePool.pop();
// 注意这里要重新执行一下构造函数
Klass.call(instance, copyFieldsFrom);
return instance;
} else {
// 没有的话,就new一个新的
return new Klass(copyFieldsFrom);
}
};
var twoArgumentPooler = function(a1, a2) {
var Klass = this;
if (Klass.instancePool.length) {
var instance = Klass.instancePool.pop();
Klass.call(instance, a1, a2);
return instance;
} else {
return new Klass(a1, a2);
}
};
// 省略其他参数的pooler实现,原理都是一样的
var standardReleaser = function(instance) {
var Klass = this;
invariant(
instance instanceof Klass,
'Trying to release an instance into a pool of a different type.',
);
// 释放前执行destructor方法
instance.destructor();
if (Klass.instancePool.length < Klass.poolSize) {
// 返回对象池复用
Klass.instancePool.push(instance);
}
};