2017-02-14 2 views
0

Я пытаюсь улучшить на небольшую библиотеку я начинаю писать:Новая библиотека JS, как ее улучшить?

var syn=(function(){ 
    var container = {}; 
     return function(variable){ 
      return{ 
       val: container[variable], 
       is: function(value){ 
        container[variable] = value; 
       } 
      }; 
     }; 
    })(); 

В настоящее время он способен хранить фрагменты информации с использованием синтаксиса syn("a").is(42); и возвращает значение, используя syn("a").val.

Я хотел бы быть в состоянии сделать две вещи с этой библиотекой:

  1. Я хотел бы иметь возможность создавать новые экземпляры объекта син, так что я мог бы создать несколько «синапсов». например, var SynapseA = new syn;
  2. Я хотел бы уменьшить syn("a").val только syn("a") так, что если я имею в виду syn("a") без свойства или метода, он возвращает эквивалент syn("a").val, но я понятия не имею, как это будет сделано?

Цените любую помощь ...

+0

Единственное, что странно, это ты доступ к контейнеру по индексу, когда контейнер является объектом. Для меня это не имеет смысла. Действительно ли это работает? – jdmdevdotnet

+0

'is' звучит как тест равенства для меня, а не как сеттер. Я действительно предлагаю вам переименовать это. Кроме того, как бы вы хотели, чтобы это работало с новым синтаксисом getter? Если 'syn (" a ")' возвращает значение, оно также не может возвращать объект с помощью метода 'is' в одно и то же время. – Bergi

+0

'container [variable]' если вы заметили скобки (обычно говоря, если это работает, то я не понимаю 100% того, как работают объекты в JS), это массив. Пример: 'container [1]' Вы обращаетесь к объекту в контейнере с индексом 1. Как вы обращаетесь к объектам, это будет больше похоже на это 'container.objectName'. Не помогает ваш вопрос вообще, только что я заметил. Выглядит странно, но если это сработает, я уверен, что есть веская причина. Просто любопытно посмотреть, что это такое. – jdmdevdotnet

ответ

0

Это будет делать то, что вы спрашиваете, я думаю:

var syn = function() { 
    this.container = {}; 
} 

syn.prototype.is = function(index, value){ 
    this.container[index] = value; 
} 

syn.prototype.val = function(index){ 
    return this.container[index]; 
} 

я могу сделать следующее:

var synapseA = new syn(); 
synapseA.is("a", 42); 
console.log(synapseA.val("a")); 

var synapseB = new syn(); 
synapseB.is("a", 30); 
console.log(synapseB.val("a")); 

synapseB.is("b", 20); 
console.log(synapseB.val("b")); 

И я получаю 42, 30 и 20 вышли из системы. Это то, что вам нужно?

+0

Зачем вы меняли «контейнер» с объекта на массив? – Bergi

+0

Исправлено, спасибо. – Chris

0

То, что вы хотите, не представляется возможным, потому что это в некотором роде противоречивой:

я хотел бы уменьшить syn("a").val только syn("a") так, что если я имею в виду syn("a") без свойства или метода, он возвращает эквивалент syn("a").val

Предположим, что это было возможно, и значение, сохраненное для «а» 42, как в вашем примере, то оба из следующих выражений нужно будет возвращать 42:

syn("a") 
syn("a").val 

Но если первый возвращает 42, то второй не может работать: 42 не имеет свойства val. Если второй работает, то первый обязательно вернет объект с свойством val, который, очевидно, не является тем, что 42. Так что это противоречие.

По моему мнению, ближайший доступ к тому, что вы хотите, опирается на специальный метод valueOf, который будет срабатывать при принуждении к числу (или булевому). Однако, чтобы это работало, вы должны предположить, что значения, которые вы храните, действительно являются числами.

Вот как это будет работать:

function Syn() { // constructor, so you can create more than 1 syn object 
 
    var container = {}; 
 
    var f = function(variable){ 
 
     return { 
 
      valueOf: function() { // special method 
 
       return container[variable]; 
 
      }, 
 
      val: container[variable], 
 
      assign: function(value){ 
 
       container[variable] = value; 
 
      } 
 
     } 
 
    }; 
 
    // Only include next line, if you REALLY need the returned 
 
    // object to be considered an instance of Syn: 
 
    Object.setPrototypeOf(f, Object.getPrototypeOf(this)); 
 
    return f; 
 
} 
 

 
var syn = new Syn(); 
 
console.log(syn instanceof Syn); // true 
 
syn("a").assign(42); 
 
console.log(syn("a").val); // 42 
 
console.log(+syn("a")); // 42, because `syn("a")` is coerced to number

NB: Я переименовал метод is к assign, как это кажется более значимым.

Аналогично valueOf, вы можете рассчитывать на toString, что делает подобную вещь, когда вы принуждать возвращаемое значение syn("a") в строку:

function Syn() { // constructor, so you can create more than 1 syn object 
 
    var container = {}; 
 
    var f = function(variable){ 
 
     return { 
 
      toString: function() { // special method 
 
       return container[variable]; 
 
      }, 
 
      val: container[variable], 
 
      assign: function(value){ 
 
       container[variable] = value; 
 
      } 
 
     } 
 
    }; 
 
    // Only include next line, if you REALLY need the returned 
 
    // object to be considered an instance of Syn: 
 
    Object.setPrototypeOf(f, Object.getPrototypeOf(this)); 
 
    return f; 
 
} 
 

 
var syn = new Syn(); 
 
console.log(syn instanceof Syn); // true 
 
syn("a").assign("hello"); 
 
console.log(syn("a").val); // "hello" 
 
console.log(''+syn("a")); // "hello", because `syn("a")` is coerced to string

+0

Что делать, если хранимое значение может быть чем угодно, а не просто числом? –

+0

Существует только один другой вариант, который я знаю: 'toString', который всегда будет возвращать строчную версию сохраненного значения, когда вы принуждаете его к строке, например, добавляя к ней другую (возможно, пустую) строку. См. Дополнение к моему ответу. Если вы ищете способ вернуть тип данных, соответствующий тому, что вы сохранили ранее: это невозможно с помощью принуждения, которое по определению работает в отношении одного конкретного типа данных. И принуждение - это единственный способ «молча» превратить значение в примитивный «эквивалент». Вот почему я начал свой ответ так, как я. ;-) – trincot

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