2015-09-26 4 views
2

прилагаю services свойство this:Как я могу ссылаться на свойство `this` внутри метода` this`?

function Client(){ 
    this.services = { 
     'propertyName' : {} 
    }; 

, а затем добавить метод this, в котором мне нужно ссылаться на services свойство экземпляра client:

function Client(){ 
    this.services = { 
     'propertyName' : {} 
    }; 
    this.someMethod = function() { 
     if (this.services['propertyName']) { 
      //do something 
     } 
    } 
} 

var clientName = new Client(); 

Но this.services - line 6 является не определено. Как использовать свойство, присвоенное this, в методе, присвоенном this? Похоже, что должен быть, потому что к моменту, когда этот метод вызывается конструктором, для объекта будет существовать свойство services. Это ограничение языка? Является ли это возможным? Должно быть?

+0

@ T.J.Crowder Что значит? Это функция, которая использует 'this', вызывается с' new' - прототипом для создания экземпляров 'Client' - как это не прототип? –

+0

Это не прототип, потому что это не прототип. Это просто объект с собственностью. Поскольку это свойство * prototype *, оно должно быть на другом объекте, который был прототипом объекта, который вы пытаетесь использовать. Например, если вы переместили 'someMethod' * out * конструктора и выполнили' Client.prototype.someMethod = function() {/ * ... * /}; ', *, что * будет свойством прототипа (' someMethod '), пытающихся получить доступ к свойству не-прототипа (' services'). (Есть также несколько других способов.) –

+0

@ T.J.Crowder Ах, я * думаю об этом * как прототип для другого объекта, но он на самом деле называется * конструктором * правильно? –

ответ

2

Но this.services - строка 6 не определена.

Это будет зависеть исключительно от , как вы называетеsomeMethod. Если вы называете это так:

clientName.someMethod(); 

... это будет хорошо, потому что this внутри вызова будет объект, созданный new Client, что вы разместили services собственность на. Но в JavaScript this не является фиксированной вещью с нормальными функциями, она задается как вы звоните функция. Итак:

var f = clientName.someMethod; 
f(); 

... потерпит неудачу, потому что this не будет объект, который вы ожидаете. (Это не относится к новой «стрелка» функций ES6, который получают this откуда они определены, не так, как они называются.)

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

doSomething(clientName.someMethod); 

... потому что doSomething не знает, какой объект использовать как this.

Вы можете это исправить с помощью Function#bind:

doSomething(clientName.someMethod.bind(clientName)); 

или аналогичным образом:

var f = clientName.someMethod.bind(clientName); 
f(); 

Function#bind создает новую функцию, которая при вызове будет вызывать оригинал this набора аргументу вас дай это.


Просто плоть мою ES6 комментарий выше: В ES6, если у вас:

function Client(){ 
    this.services = { 
     'propertyName' : {} 
    }; 
    this.someMethod =() => {     // <== ES6 "arrow" function 
     if (this.services['propertyName']) { 
      //do something 
     } 
    } 
} 

... это не имеет значения, как вы назвали someMethod, this бы, что это такое, где Эта функция была Создано. В. удобно.:-)

+2

Говоря в ES6, могу вас заверить, вы * не * [этот парень] (http://dilbert.com/) полоса/2010-12-23). Спасибо за вашу помощь! –

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