ポインタを使用しているのは、ポインタを逆参照して別の変数にアクセスすることだけなので、プロパティにカプセル化するだけです。
function createPointer(read, write) {
return { get value() { return read(); }, set value(v) { return write(v); } };
}
ポインタを作成するには、ポイントされている変数を読み書きするアクセサメソッドを渡します。
var i;
var p = createPointer(function() { return i; }, function(v) { i = v; });
// p is now a "pointer" to i
ポインターを逆参照するには、その値にアクセスします。言い換えれば、Cで*p
ここに書くのはどこに書くのかということですp.value
。
i = "initial";
alert(p.value); // alerts "initial"
p.value = "update";
alert(i); // alerts "update"
p.value += "2";
alert(i); // alerts "update2"
同じ変数への複数のポインターを作成できます。
var q = createPointer(function() { return i; }, function(v) { i = v; });
// q is also a "pointer" to i
alert(q.value); // alerts "update2"
q.value = "written from q";
alert(p.value); // alerts "written from q"
ポインタ変数を別のポインタで上書きするだけで、ポインタが指すものを変更できます。
var j = "other";
q = createPointer(function() { return j; }, function(v) { j = v; });
// q is now a "pointer" to j
ポインタを介して2つの変数を交換できます。
function swap(x, y) {
var t = x.value;
x.value = y.value;
y.value = t;
}
i
との値j
をそれらのポインタを使用して交換してみましょう。
swap(p, q);
alert(i); // alerts "other"
alert(j); // alerts "written from q"
ローカル変数へのポインタを作成できます。
function example() {
var myVar = "myVar as local variable from example";
var r = createPointer(function() { return myVar; }, function(v) { myVar = v; });
swap(p,r);
alert(i); // alerts "myVar as local variable from example"
alert(myVar); // alerts "other"
}
example();
クロージャの魔法を通して、これはあなたにmallocをシミュレートする方法を与えます。
function malloc() {
var i;
return createPointer(function() { return i; }, function(v) { i = v; });
}
var p = malloc(); // p points to a variable we just allocated from the heap
p.value = 2; // write a 2 into it
あなたの魔法のトリックも機能します:
var flowers = new Misdirection(
createPointer(function() { return flowers; }, function(v) { flowers = v; }));
flowers.abracadabra();
alert(flowers);
function Misdirection(flowers) {
this.abracadabra = function() {
flowers.value = new Rabbit;
};
}
function Rabbit() {
this.toString = function() { return "Eh... what's up doc?" };
}