最近我偶然发现 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)。
我想知道在这种技术中是否存在一些我没有看到的明显缺陷,或者这可能是实现类型参数的有效方式?
谢谢!