最近我偶然发现JavaScript允许您将对象或数组作为对象参数的键传递。例如:
var myType = { 'Name':'MyType' };
var myObject = {};
myObject[myType] = 1;
将myObject[myType];
返回1
从进一步观察到这一点,似乎内部对象的.toString()
方法被调用并作为实际键传递。在上面的示例中,这实际上是分开的,因为这意味着正在设置的myObject['[object Object]']
正在设置,这意味着传入的任何标准对象都将访问相同的密钥。
但是,我决定通过创建自定义对象来扩展它,这会导致他们的.toString()
方法返回其构造函数。这意味着它将为每个对象类型返回唯一键。基于此,我创建了以下使用此技术创建类型参数的相对干净的实现的示例:
function Cat() {}
function Dog() {}
function AnimalPack() {
this.speech = "";
this.size = 0;
}
AnimalPack[Cat] = function() {
var pack = new AnimalPack();
pack.speech = "mew";
pack.size = 2;
return pack;
}
AnimalPack[Dog] = function() {
var pack = new AnimalPack();
pack.speech = "bark";
pack.size = 4;
return pack;
}
AnimalPack.prototype.Speak = function() {
var speak = [];
for(var i=0; i<this.size; i++) {
speak.push(this.speech);
}
return speak.join(" ");
}
var catparty = new AnimalPack[Cat]();
var dogparty = new AnimalPack[Dog]();
在此示例中,catparty.Speak()
将返回'mew mew'
,dogparty.Speak()
将返回'bark bark bark bark'
。
这也可以用于本机JavaScript类型(字符串,数字等)。
这似乎适用于所有5种主要浏览器(chrome,firefox,即safari,opera)。
我想知道在这种技术中是否存在一些我没有看到的明显缺陷,或者这是否是实现类型参数的有效方法?
谢谢!