Могу ли я выполнить действия во время создания объекта, изменив прототип Function? - PullRequest
1 голос
/ 14 июля 2009

Я хотел бы дополнить объект Function для выполнения большего количества операций при создании нового объекта.
Возможно ли это?

1 Ответ

2 голосов
/ 14 июля 2009

Нет способа изменить прототип функции, чтобы вы могли перехватывать вызовы функции. Самое близкое, что вы собираетесь сделать, это добавить метод, который вы можете вызвать вместо конструктора. Например:

Function.prototype.create = function() {
    var obj = new this();  // instantiate the object
    this.apply(obj, arguments);  // call the constructor

    // do your stuff here (e.g. add properties or whatever it is you wanted to do)
    obj.foo = 'bar';

    return obj;
};

function SomeObject(name) {
    this.name = name;
}

var obj = SomeObject.create('Bob');
obj.foo; // => 'bar'

В качестве альтернативы вы можете написать функцию, которую вы бы вызвали для построения конструктора:

Function.makeConstructor = function(fn) {
    return function proxyConstructor() {
        // check to see if they called the function with the "new" operator
        if(this instanceof proxyConstructor) {
            var obj = new fn();
            fn.apply(obj, arguments);

            // do your stuff here (e.g. add properties or whatever it is you wanted to do)
            obj.foo = 'bar';

            return obj;
        } else {
            return fn.apply(null, arguments);
        }
    };
};

var SomeObject = Function.makeConstructor(function(name) {
    this.name = name;
});

var obj = SomeObject.create('Bob');
obj.foo; // => 'bar'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...