2017-02-14 4 views
0

Ich versuche, auf eine kleine Bibliothek zu verbessern ich zu schreiben fange:Neue JS-Bibliothek, wie verbessert man sie?

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

Derzeit ist es speichern kann Schnipsel von Informationen mit der Syntax syn("a").is(42); und die Rückgabe des Werts von syn("a").val verwenden.

Ich möchte in der Lage sein, zwei Dinge mit dieser Bibliothek zu tun:

  1. Ich möchte in der Lage sein, neue Instanzen des syn-Objekts zu erstellen, so dass ich mehr „Synapsen“ erstellen. z.B. var SynapseA = new syn;
  2. Ich möchte syn("a").val zu reduzieren, um nur syn("a") so, dass wenn ich auf syn("a") ohne eine Eigenschaft oder Methode verweisen sie das Äquivalent von syn("a").val zurückkommt, aber ich habe keine Ahnung, wie dies geschehen würde?

Jede mögliche Hilfe schätzen ...

+0

Eine Sache, die ungerade ist, ist du bist Zugreifen auf Container an einem Index, wenn Container ein Objekt ist. Das ergibt für mich keinen Sinn. Funktioniert es tatsächlich? – jdmdevdotnet

+0

'ist' klingt für mich wie ein Gleichheitstest, nicht wie ein Setter. Ich empfehle Ihnen wirklich, dies umzubenennen. Wie möchten Sie das mit der neuen Getter-Syntax? Wenn 'syn (" a ")' den Wert zurückgibt, kann es auch nicht gleichzeitig ein Objekt mit einer 'is'-Methode zurückgeben. – Bergi

+0

'Container [Variable]' Wenn Sie die Klammern bemerken, (konventionell, wenn es funktioniert, dann verstehe ich nicht 100% wie Objekte in JS arbeiten), das ist ein Array. Beispiel: 'container [1]' Sie greifen auf das Objekt im Container mit dem Index 1 zu. Wie Sie auf Objekte zugreifen, wäre eher wie 'container.objectName'. Es hilft deiner Frage überhaupt nicht, nur etwas, das ich bemerkt habe. Sieht seltsam aus, aber wenn es funktioniert, bin ich sicher, dass es einen triftigen Grund gibt. Nur neugierig zu sehen, was es ist. – jdmdevdotnet

Antwort

0

Dies wird tun, was du ich bist fragen denken:

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")); 

Und ich bekomme:

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

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

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

ich folgendes tun können 42, 30 und 20 ausgeloggt. Ist es das wonach du suchst?

+0

Warum haben Sie 'container' vom Objekt in ein Array geändert? – Bergi

+0

Korrigiert, danke. – Chris

0

Was Sie wollen, ist nicht möglich, weil es in gewisser Weise widersprüchlich ist:

Ich möchte syn("a").val zu reduzieren syn("a") nur so, dass, wenn ich syn("a") ohne eine Eigenschaft oder Methode verweisen sie die zurück Äquivalent syn("a").val

dies für „a“ möglich ist, und der Wert gespeichert wird angenommen, waren 42, wie in Ihrem Beispiel, dann müssten die beiden folgenden Ausdrücke 42 zurückzukehren:

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

Aber wenn die erste 42 zurückgibt, dann kann die zweite nicht funktionieren: 42 hat keine Eigenschaft val. Wenn der zweite funktioniert, dann wird der erste notwendigerweise ein Objekt mit einer val Eigenschaft zurückgeben, was offensichtlich nicht 42 ist. Das ist also ein Widerspruch.

Meiner Meinung nach ist der nächste, den Sie erreichen können, was Sie wollen, sich auf die spezielle Methode valueOf zu verlassen, die eingreift, wenn Sie Zwang auf eine Zahl (oder einen Booleschen Wert) erzwingen. Damit dies funktioniert, müssen Sie jedoch davon ausgehen, dass die von Ihnen gespeicherten Werte tatsächlich Zahlen sind.

Hier ist, wie es funktionieren würde:

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: Ich habe die Methode is-assign umbenannt, so dass mehr sinnvoll erscheint.

Ähnlich valueOf, könnten Sie auf toString, verlassen, die eine ähnliche Sache tut, wenn Sie den Rückgabewert von syn("a") bespannen coerce:

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

Was ist, wenn der gespeicherte Wert irgendetwas sein kann, nicht nur eine Zahl? –

+0

Es gibt nur eine andere Variante, die ich kenne: 'toString', die immer eine String-Version des gespeicherten Wertes zurückgibt, wenn man sie in einen String umwandelt, indem man einen anderen (möglicherweise leeren) String hinzufügt. Siehe Ergänzung zu meiner Antwort. Wenn Sie nach einem Weg suchen, einen Datentyp zurückzugeben, der dem entspricht, was Sie zuvor gespeichert haben: Dies ist nicht über Zwang möglich, was definitionsgemäß auf einen bestimmten Datentyp zutrifft. Und Zwang ist die einzige Möglichkeit, einen Wert "stillschweigend" in ein primitives "Äquivalent" zu verwandeln. Deshalb habe ich meine Antwort wie ich begonnen. ;-) – trincot

Verwandte Themen