2015-06-06 2 views
0

У меня есть следующий объект:Убедитесь, что это относится к объекту

dog = { 
    location: { 
    x: 52.1089, 
    y: 16.2323 
    }, 
    f: function(message) { 
    alert(message + this.location.x); 
    return; 
    } 
}; 

Теперь мне нужно, чтобы начать прохождение функции dog.f к API в различных контекстах. Моя проблема заключается в том, что не всегда ссылается на мой объект, но на разные вещи в зависимости от того, как он называется. Как я могу получить доступ к таким свойствам, как location внутри функции f?

EDIT: Я действительно хочу только метод f, но я не хочу инициализировать местоположение внутри f для каждого вызова функции, поэтому я думал, что объект будет лучшей идеей. Это была моя первая попытка:

var f = function(message) { 
    var location: { 
     x: 52.1089, 
     y: 16.2323 
    } 
    alert(message + location.x); 
    return; 
    } 

но выглядит бесполезно для определения местоположения при каждом вызове функции.

EDIT 2: Я открыт для решения CoffeeScript

+0

Я предлагаю спиннинг через некоторые учебники JS ООП; похоже, вы хотите подражать классу. –

+0

Да, см. Мое редактирование. Я хочу функцию с состоянием, но я думал, что класс будет излишним, и объект будет делать. – Elian

+0

У CoffeeScript есть запеченные классы, я не возражаю против его использования. –

ответ

2

Вы могли бы рассмотреть вопрос об использовании закрытия (см Private Members in JavaScript):

var dog = (function() { 
    var location = {x: 52, y:16}; 
    return { 
    getLocation: function() { 
     return [location.x, location.y]; 
    }, 
    setLocation: function (newX, newY) { 
     location.x = newX; 
     location.y = newY; 
    }, 
    showMessage: function(message) { 
     alert(message + location.x); 
    } 
    }; 
}()); 

dog.showMessage('here : '); 
+0

Это в принципе то, что я хочу, закрытие. Я надеялся, что объект сделает это, поскольку код выглядит более чистым. – Elian

4

Вы можете использовать bind method установить контекст для метода:

var func = dog.f.bind(dog); 

При вызове func из любого места, она будет иметь тот же контекст, как если бы он назывался dog.f.

Примечание. Метод bind не поддерживается в старых браузерах, например IE 8 и старше, поэтому вам понадобится «polyfill», если вам нужно их поддерживать. В документации, к которой я привязан, есть одна.

+0

, где должна проходить эта линия, вне объекта? – Elian

+0

Могу ли я «autobind» функцию f внутри объекта? – Elian

+0

@Elian: Вы используете это везде, где хотите ссылку на метод с привязанным к нему объектом. На самом деле вам нужно только выражение справа, я поставил его в задание, чтобы показать, как вы можете его использовать. Вы не можете autobind его в объекте, поскольку объект еще не существует, когда функция создана. – Guffa

0

Вы, вероятно, хотите сделать это

var Dog = function() { 
    this.location = { 
    x: 52.1089, 
    y: 16.2323 
    }; 
    this.f = function(message) { 
    alert(message + this.location.x); 
    return; 
    } 
}; 

var dogObj = new Dog(); 

dogObj.f("Hellow World!"); 
+0

Я пытался избежать создания экземпляра 'var dogObj = new Dog();' но вполне возможно, что мне придется это сделать. – Elian

+2

Это не решит проблему. Когда вы передаете значение 'dogObj.f' где-то и оно вызывается,' this' все равно не будет объектом. – Guffa