2

最近我偶然发现 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)。

我想知道在这种技术中是否存在一些我没有看到的明显缺陷,或者这可能是实现类型参数的有效方式?

谢谢!

4

1 回答 1

0

你不需要那样做。你可以试试这个:

/function ([^(]*)/g.exec(dog.constructor)[1]

演示

于 2012-05-04T16:47:32.423 回答