Как ссылаться на состояние функции javascript без явной ссылки на ее имя

#javascript

Вопрос:

Как я могу установить состояние https://jsfiddle.net/7q1530sp/10/ не работает

 function o(){
 this.state = true;
}

o.f = function() {
  alert(this.state);
}
o.state = false;
o();
o.f();
 

вместо того, чтобы явно ссылаться на o в рамках его функции https://jsfiddle.net/7q1530sp/9/

 function o(){
 o.state = true;
}

o.f = function() {
  alert(this.state);
}
o.state = false;
o();
o.f();
 

Есть ли способ ссылаться на o без использования его имени ?

Комментарии:

1. Вместо этого используйте обычную переменную?

2. Что ты имеешь в виду? Глобальная переменная ? Это было бы нечестно.

3. Возможность делать o.state = false; это из любого места на самом деле не лучше — с точки зрения ремонтопригодности, это похоже на наличие глобальной state переменной

4. это все еще лучше для документации, потому что она прикреплена к o 😉

5. Тогда лучше вернуть объект с двумя свойствами, вместо того, чтобы злоупотреблять такой функцией, как коллекция ключ-значение

Ответ №1:

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

 var my = new fn()
 

Тем не менее, я бы посоветовал вам выбрать прототипы:

В дополнение к удобству в использовании, в случае сложных проектов, они также позволят вам разделить ваш проект на несколько файлов, сохраняя при этом код чистым и аккуратным!

Я оставляю вам небольшой пример того, как используются прототипы:

 var my = function(){}
my.prototype.test = true;
my.prototype.run = function(){
    console.log(this.test)
}

var w = new my();
w.run();
w.test = false;
w.run();
 

Обновление:
Конечно, вы также можете глобально изменить значение переменной следующим образом:

 var my = function(){}
my.prototype.test = true;
my.prototype.run = function(){
    console.log(this.test)
}

new my().run();
my.prototype.test = false;
new my().run();
 

Выход:

 true
false
 

Комментарии:

1. спасибо, придется немного поработать, прежде чем отмечать это как правильный ответ 🙂

2. хорошо!!!!!!!!!!!!! 🙂