2017-05-18 12 views
0

私はポインタのような振る舞いでオブジェクトをコーディングしようとしています。 他の言語で使用されているような実際のポインタではありませんが、データの一部を参照するものが必要なので、私はそのことを常に伝えることができ、常にそれを参照しています。 データ。Javascriptとポインタのようなオブジェクト

次のコードを考えてみましょう:私は今、何をやっている

var Pointer = function (data) { 
    var instance = {}; 
    instance.deref = function() { return data; }; 
    return instance; 
}; 

を、ポインタインスタンスのスコープ内のデータを記憶しています。

私の質問は: は、私は他に1つの場所からのポインタの束を移動しなければならないとき速度の点で重大な欠点を持っているポインタの範囲にデータを格納していますか? データがこれらのポインタによって表されるデータ構造を想像してみましょう。すべてがその範囲内にユニークなデータを持っています。ポインタを動かして構造を操作する必要があります。

答えて

3

なぜこれをクロージャーで囲むのが問題なのですか? すべてのオブジェクトはポインタのような動作をします。あなたが作品を作成する作業をしない限り、オブジェクトの深いコピーを取得することはありません。

var x = {}, y; 
x.data = "foo"; 
y = x; 
y.data = "bar"; 
console.log(x.data) // "bar" because y and x are references to the same object 

は本当に、CスタイルのポインタからのJavaScriptの参照を区別唯一の主要な動作は、ポインタ演算の欠如または整数から/へのポインタをキャストです。参照されているオブジェクトのコピーを作成せずに、データ構造内のオブジェクトへの参照を確実にシャッフルできます。

上記のコードでは、言語が正確であればxとyはオブジェクトではなく、xとyはオブジェクトへの参照(ポインタに非常に似ています)です。空のオブジェクトをxに代入すると、xは空のオブジェクトを参照するようになります。後に、yと同じオブジェクトを参照するようにyを設定します。

+0

また、OPは、そのオブジェクトを「const」と宣言したい場合があります。これは「常に同じデータを参照しています」ということを保証します。 –

+0

私は、データ型をポインタのプライベートプロパティのようにするためにクロージャを使用し、データにアクセスできる方法を制御しました。私の例は単純化されています。私は 'Object.defineProperty()'、 'preventExtensions()'、 'seal()'、 'freeze()'などのことを認識しています。 私はポインタ算術演算を行う必要はありませんし、アドレスを使用するので、私はこれの欠如を気にしません。 – MPS

+0

私は私の事例をさらに単純化し、あなたがしたことをすることができたと思います。それから私はおそらくそれがポインタの範囲にあるデータ自体ではなく、参照でもあることに気づいたでしょう。あなたの例はそれをはっきりと示し、私の質問に答えました。しかし、私はいくつかのデータ構造を作りたいと思っています。私のプロジェクトでは、このようなものにポインタ(または他のもの)のような名前を付けるのが理にかなっています。これは、オブジェクトの唯一の目的と機能が、他の場所のデータを参照することであることを明確にしています。誰が何を知っているかのオブジェクトではなく、 – MPS

関連する問題