JavaScript类型参数的有效性?

时间:2012-05-04 16:37:48

标签: javascript oop

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

DEMO