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
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
'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
'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