2016-03-19 2 views
0

Мне просто интересно, могу ли я сделать некоторые из моих вспомогательных функций (для таких вещей, как скамейка, регистрация и кеширование) немного опрятно. Сейчас я делаю этоМожете ли вы получить объект метода?

function doSomethingToMethodsObject(object, methodname) { 
    //do things to object and object[methodname] 
} 

так что я могу использовать его как этот

var myObject = function() { 
    this.myString = "hello"; 
    this.myMethod = function() { return this.myString; }.bind(this); 
    doSomethingToMethodsObject(this, "myMethod"); 
} 

, но было бы лучше, если бы я мог бы назвать это как этот

doSomethingToMethodsObject(this.myMethod); 

, а затем перерыв вниз ссылку на эту функцию и «myMethod» внутри doSomethingToMethodsObject.

Так есть способ выяснить, к каким объектам принадлежит функция?

+0

правопреемником 'this' к переменной и использовать его как' вар я = это; '' этого.myMethod = function() {return self.myString; } .bind (selft); ' –

+1

Что именно эти« вещи »вы делаете для« объекта »? – Bergi

ответ

1

Так есть способ выяснить, к каким объектам принадлежит функция?

Функция не относится только к одному объекту. Там может быть много ссылок на эту же функцию на множество разных объектов. Итак, нет, вы не можете точно определить, к какому объекту принадлежит функция, просто глядя на функцию.

В самом деле, почему вы передаете this.myMethod в качестве аргумента, нет никакой связи с переданной частью this. Он просто получает ссылку на функцию и передает ее.

Вы можете использовать .bind() для передачи связанной ссылки на функцию, но это позволяет вам вызывать метод в контексте нужного объекта - это не позволяет вам выделить объект из метода. Если вам нужен как объект, так и метод отдельно в вашей функции, вам нужно будет найти способ сделать их как отдельными доступными внутри функции - наиболее очевидный способ сделать это - просто передать их как аргументы.

В зависимости от конкретных условий (которые вы действительно не разделяют очень много), иногда вы можете использовать родительский контекстные переменные, как var self = this; сохранить ссылку на this, которые могут быть доступны с помощью дочерних функций, но я не Конечно, это относится к тому, что вы делаете.

Вот некоторые варианты:

doSomethingToMethodsObject(this, this.myMethod); 

doSomethingToMethodsObject({obj: this, method: this.myMethod}); 
0

При использовании this.myMethod, JS создает ссылку на базу которого this и ссылки, чье имя "myMethod".

Однако, когда вы используете его в качестве аргумента, JS разрешает ссылку в значение свойства. Поэтому в doSomethingToMethodsObject, слишком поздно, чтобы получить базу.

Единственным способом получения базы this.myMethod является то, что myMethod - это свойство accessor с геттером, который перенаправляет на значение объекта. Затем вы можете использовать внутри получателя и сохранить его в свойстве базового значения.

Например:

var obj = { 
    _myMethod: function(arg) { /* Underlying function */ 
    return {thisArg: this, arg: arg}; 
    }, 
    get myMethod() { /* Stores reference parts and redirects */ 
    return Object.assign(this._myMethod, { 
     refBase: this, 
     refName: "_myMethod" 
    }); 
    } 
}; 
function doSomethingToMethodsObject(value) { 
    return value.call(
    value.refBase, 
    value === value.refBase[value.refName] 
); 
} 
obj.myMethod(123); // {thisArg: obj, arg: 123} 
doSomethingToMethodsObject(obj.myMethod); // {thisArg: obj, arg: true} 
+0

Конечно, этот подход разрушает нормальный 'this.myMethod()' вызывает – Bergi

+0

@Bergi Хорошая точка. Я предполагаю, что getter может вернуть функцию, которая перенаправляет вызовы на '_myMethod' (или' 'myMethod') и сохраняет' this' как свойство этой функции. – Oriol

Смежные вопросы