Javascript:是否可以创建一个在创建Object / String ...时自动触发的函数?

时间:2011-12-12 08:13:03

标签: javascript oop object orientation magic-methods

问题很简单。就像在PHP中我们有魔术函数__construct()一样,是否有任何相关函数或黑客我可以在javascript中使用?

示例:

function setLength() {
    /* Some work */
}

var a = new Object();
b = new String("Hello");
//Is there anyway the function setLength() will automatically be fired when an Object or String... created?

我期待着你的回答。非常感谢您的帮助。

[X]

3 个答案:

答案 0 :(得分:2)

尝试过载String会是一个坏主意,尤其是在与第三方库合作时。同样会增加Object

但是,你可以这样做,但我不推荐它..

var _String = String;

window.String = function() {
        setLength();
        return new _String(arguments[0]);
}

在创建原始字符串时,显然不会调用它。

jsFiddle


您可以使用字符串工厂函数返回一个新的String对象并调用您的函数。

var stringFactory = function(chars) {
    setLength();
    return new String(chars);  
}

这有一些优点,主要是String构造函数没有重载。

答案 1 :(得分:1)

您可以通过执行此类操作来创建自己的对象。该函数充当构造函数:

$(document).ready(function(){

    var instance = new object('test123');

    alert('Instance: '+instance.len);

    function object(var1){
        this.var1 = var1;

        this.len = this.var1.length;
    }
});

答案 2 :(得分:0)

您可以覆盖string.prototype.constructor以更改字符串构造函数的默认功能,并object.prototype.constructor来更改对象构造函数的默认功能。

<击>

但是,覆盖JavaScript核心类的默认功能被广泛认为是不好的做法,并且可能有更好的方法来实现最终目标。 如果您决定这样做,您也可以阅读以下SO帖子,了解如何使用引用被覆盖函数的函数覆盖函数:Overriding a JavaScript function while referencing the original

搞乱了jsFiddle,然后做了一些研究。我发现我其实是错的。字符串基元是不可变的,因此您不能像我建议的那样覆盖构造函数。查看String prototype modifying itself,了解更多相关信息。