Javascript: возможно ли иметь функцию, которая автоматически запускается при создании объекта / строки ...? - PullRequest
0 голосов
/ 12 декабря 2011

вопрос прямой. Так же, как в 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?

Я с нетерпением жду ваших ответов. Большое спасибо за любую помощь.

[х]

Ответы [ 3 ]

2 голосов
/ 12 декабря 2011

Попытка перегрузки String была бы плохой идеей , особенно при работе со сторонними библиотеками.То же самое можно сказать и об увеличении Object.

Однако вот как вы можете это сделать, но я не рекомендую это ..

var _String = String;

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

Это, очевидно, не будет называтьсяи при создании простой строки.

jsFiddle .


Вы можете использовать функцию string factory , которая возвращает новую Stringобъект и вызывает вашу функцию.

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

Это имеет некоторые преимущества, в основном конструктор String не перегружен.

1 голос
/ 12 декабря 2011

Вы можете просто создать свой собственный объект, сделав что-то вроде этого. Функция действует как конструктор:

$(document).ready(function(){

    var instance = new object('test123');

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

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

        this.len = this.var1.length;
    }
});
0 голосов
/ 12 декабря 2011

Вы можете переопределить string.prototype.constructor, чтобы изменить функциональность по умолчанию для конструктора строки, и object.prototype.constructor, чтобы изменить функциональность по умолчанию для конструктора объекта.

Однако, переопределение функциональности по умолчанию основных классов JavaScript широко считается плохой практикой, и, вероятно, есть лучший способ для достижения конечной цели. Если вы решите сделать это, вам также может быть полезно прочитать следующее сообщение SO о переопределении функции с функцией, которая ссылается на переопределенную функцию: Переопределение функции JavaScript при обращении к исходной

После того, как возиться с jsFiddle, а затем провести некоторые исследования.Я узнал, что я на самом деле не прав.Строковые примитивы являются неизменяемыми, поэтому вы не можете переопределить конструктор, как я и предлагал.Проверьте Прототип строки, модифицирующий себя , для получения дополнительной информации об этом.

...