2012-03-08 6 views
0

の配列の値を削除しようとしていますが、そのメソッドを削除しないでください。また、私が探している動作ではありません機能.send()を、削除します子のメソッドを失うことなく変数の値を削除する

var Project = function() { 

    //The array where all data will be stored before they are sent.. 
    this.data = []; 

    // ... Along with a function to send data to other source ... 
    this.data.send = function() { 
    } 

    //Here is where the data would be altered ... 

    //Send the data ... 
    this.data.send(); 

    //Remove the data, we don't want it when sending the next time ... 
    this.data = []; 
    // ... but this (obviously) results in the removal of the send() function ... :-(
} 

:次のコードを考えてみましょう。この問題を避ける最もスムーズで最も適切な方法は何ですか?ありがとう!

+0

アレイの長さをゼロに設定するとどうなりますか?ここの暗闇の中でちょうど一発。 –

+0

配列に関数を格納する理由は何ですか? – Eduardo

+0

@エドゥアルドそれは非常に良い質問です。単純に:私は正しく考えていませんでした。 – Zar

答えて

3

Sirkoの提案はうまくいくはずですが、私の意見では、問題が設計上の欠陥を指摘しています。

オブジェクトのような配列を公開しないでください。メソッドは変更されないが、内部配列を持ち、自由に操作できます。

var data = { 
    items: [], 
    push: function(item) { 
    this.items.push(item); 
    }, 
    send: function() { 
    // send the items 
    this.items = []; 
    } 
} 

data.push('abc'); 
data.send(); 
console.log(data.items.length) // 0 

配列を配列にし、他の構造体を使用してそれらを操作します。

+0

まさに私が探していたものです。どうして私が最初からそれをしなかったのか、本当に知りません、ありがとう! – Zar

+0

配列が別のオブジェクトの中にラップされる必要があり、一連の配列メソッドを再実装する必要があるのは私には不明です。どうして?フレキシブルなJSがどのような意味を持つのかは、 '.push()'と '.length()'とすべてのアクセサを再構成する必要がないということです。既存のオブジェクトに新しいメソッドを追加するだけで、既に存在するすべてのメソッドを保持することができます。 '.clear()'メソッドを追加したい場合は、既存のプロパティを保持しますが、配列をクリアするには '.clear()'メソッドを追加するだけです。 – jfriend00

+0

他のオブジェクトに配列をカプセル化することについて私が考えることができる唯一の正当な理由は、配列メソッドを実際に他のコードから隠しておきたい場合です。 – jfriend00

2

this.data = [];を使用すると、古い配列オブジェクトを新しい配列オブジェクトに置き換えて、すべての接続関数を失います。プロパティを保持するには、既存のオブジェクトを変更する必要があります。あなたは、例えばsplice[email protected])を使用することができます:エリオットボンネビルとしてまた

this.data.splice(0, this.data.length); 

あなたがゼロに長さを設定することができ示唆([email protected]

this.data.length = 0; 
+0

ああ、素敵!私はすべてのプロパティを反復することを含むいくつかの恐ろしい解決法を(思考以上に)ハッキングしていました。 – Corbin

+0

乱用する配列の厄介な解決策とは対照的に? ; P – JonnyReeves

+0

まあええ。この質問を見たときの私の最初の反応は健康的なものでしたか?私の脳に圧倒されて、Zarになぜ彼がこのことをしているのかを尋ねるように言った。 – Corbin

1

は、あなただけ行うことができます。

this.data.length = 0; 

そして、既存の配列は空になり、その他のプロパティはすべて保存されます。 javascript配列の使用についてはan interesting referenceです。

関連する問題