Предположим, у меня есть такой код:

function GraphFactory() {

  this.nodeNames = [];
  this.pinnedNodes = [];


  this.initPinnedNodes = function(nodes) {
    if (nodes) {
      this.pinnedNodes = nodes;
    } else {
      this.pinnedNodes = [];
    }
  }
  this.checkIfPinned = function(node) {
    if (this.pinnedNodes.indexOf(node) > -1) {
      return true;
    } else {
      return false;
    }
  }
  this.addToPinnedNodes = function(name) {
    this.pinnedNodes.push(name);
    return true;
  }
  this.removeFromPinnedNodes = function(name) {
    this.pinnedNodes.splice(this.pinnedNodes.indexOf(name), 1);
    return true;
  }
}

let graphFactory = new GraphFactory();

Прямо сейчас я могу получить доступ как к функции

graphFactory.checkIfPinned(label);

Но и непосредственно переменная

graphFactory.pinnedNodes

Как бы я настроил так, чтобы к функциям могли обращаться только функции, а не переменные?

-1
Aerodynamika 12 Апр 2019 в 13:20

2 ответа

Лучший ответ

Используйте переменные вместо свойств объекта.

let nodeNames = [];

Они будут закрыты вашими динамически назначенными методами экземпляра.

Или посмотрите этот вопрос о современном подходе.

1
Quentin 12 Апр 2019 в 10:24

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

function GraphFactory() {
  var nodeNames = [];
  var pinnedNodes = [];

  this.initPinnedNodes = function(nodes) {
    if (nodes) {
      pinnedNodes = nodes;
    } else {
      pinnedNodes = [];
    }
  }
  this.checkIfPinned = function(node) {
    if (pinnedNodes.indexOf(node) > -1) {
      return true;
    } else {
      return false;
    }
  }
  this.addToPinnedNodes = function(name) {
    pinnedNodes.push(name);
    return true;
  }
  this.removeFromPinnedNodes = function(name) {
    pinnedNodes.splice(this.pinnedNodes.indexOf(name), 1);
    return true;
  }
}

let graphFactory = new GraphFactory();

Однако такие переменные не будут доступны для методов, которые вы добавите позже, извне. Например, nodeNames существует напрасно.

0
tevemadar 12 Апр 2019 в 10:27