2013-04-04 12 views
5

のインスタンスにJSON文字列を回し、私は特定の形式でのAJAX呼び出しからJSON文字列の束を戻ってきたし、私自身のJavaScriptオブジェクトにそれらのすべてを変換するために開始するとき、私は簡単な方法があるかどうか疑問に思い始めますここではJavascriptを話しているからですJavascriptが機能

私はvar manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; を持っているだろうなど、私は物事を行うことができるように簡単に私の機能をこれらの各オブジェクトを関連付けるしたい:私は私の懸念はあると思い

myClass.prototype.doSomething = function() { 
    // do something to this.name 
}; 

$.each(manyOfThem, function(index, item) { 
    item.doSomething(); 
}); 

、私は望んでいないだろう(その繰り返しのため)これを行う:

var myClass = function(item) { 
    this.name = item.name; 
    // do the same for the rest of item's potentially 20 properties 
}; 

var oneOfThem = new myClass(manyOfThem[0]); // I think this is redundant.... 
oneOfThem.doSomething(); 

とにかく、また私も共有してくださいそれを吸うために持っており、手動ですべての操作を行いたい理由(セキュリティ?)な理由がある場合に、感謝を!

あなたが意味
+0

私はそれはあなたがdoSomething' '中に欲しいものに依存だと思います。あなたの計画は何か分かりますか?好きな理由あなただけの 'doSomething'と呼ばれる' function'を作成し、それに 'item'を渡すことができませんでしたか? – Ian

+0

あなたは常に持っている可能性があり、 '(この場合は' manyOfThem')の配列を受け入れるmyClass'。そして、そのアイテムの1つ( 'doSomething'関数を呼び出す)を操作したいときは、3番目のインデックスを意味する' myClass.doSomething(3) 'を実行できます。その後、内部的には、配列の3番目の項目(配列を公開することなく)で動作します。 – Ian

+0

@ianそれは本当に何でもかまいません。もしdoSomethingが何の外の関数であったとしても、それはグローバルネームスペースでは1です。2.対オブジェクト指向設計 – Lim

答えて

3

、のようなもの(jsfiddleを参照してください):

var MyClass = function() {}; 
MyClass.prototype = { 
    doSomething: function() { 
     alert(this.name); 
    } 
}; 

その後

var manyObj = $.map(manyOfThem, function(obj) { 
    return $.extend(new MyClass(), obj); 
}); 

だから、あなたが呼び出すことができます。

manyObj[0].doSomething(); // alert("a") 

しかし、このアプローチは、直接に保持されませんmanyOfThemオブジェクトでコピーします。 (上記の例では、manyOfThem[0].name = "foo";を変更することがmanyObj[0]"a"manyObj[0].doSomething();への呼び出しがまだ警告しますには影響しません、あなたのオブジェクトへの直接参照を保持するには、次の操作を行います。

var manyObj = $.map(manyOfThem, function(obj) { 
    function F() {}; 
    F.constructor = MyClass; 
    F.prototype = obj; 
    $.extend(F.prototype, new MyClass()); 
    return new F(); 
}); 


manyObj[0].doSomething(); // alert("a") 

manyOfThem[0].name = "foo"; // modify the referenced object 

manyObj[0].doSomething(); // alert("foo") ..also modifies the behaviour of the instance 
+0

こんにちは、ありがとう機能は私が探しているキーです。しかし、オブジェクトへの直接の参照を保持するために、プロトタイプに 'thisのようなインスタンス変数も含まれることを確認できますか?name'と_can_を 'F.prototype'に完全にコピーできますか? – Lim

+1

はい、定義されている関数またはプロパティはすべてオブジェクトにコピーされます。たとえば、オブジェクトのクローン作成は 'var clone = $ .extend({}、sourceObj);'を使って行います。この場合、 'F.prototype'は匿名クラスレベルの関数コンストラクタとして動作し、' manyOfThem'オブジェクトをテンプレートとして使用して新しいプロトタイプを作成し、新しいインスタンス「MyClass」で拡張します(それぞれ個別のスコープを持ちます)。 –

+0

私は正直に言うと、まだ 'prototype'にコピーされているオブジェクトインスタンスのプロパティの概念をまだ理解していませんが、セマンティクスが何をしているのかを推測します。あなたの答えをありがとう! – Lim

0

あなたは

var myClass = function(item){ 
    for(i in item){ 
     if (item.hasOwnProperty(i)){ 
      this[i] = item[i]; 
     } 
    } 
}; 
を行うことができます

これはmyClassコンストラクタで繰り返し割り当てを減らす必要があります。

2

クラスを使用することなく、一つの解決策は

です
var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; 

function doSomething(){ 
    console.log(this.name) 
} 

$.each(manyOfThem, function(index, item) { 
    doSomething.call(item); 
}); 

デモ:Fiddle

あなたがタイプMyClasのインスタンスを作成したい場合は、

var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; 

function MyClass(item){ 
    $.extend(this, item); 
} 

MyClass.prototype.doSomething = function(){ 
    console.log(this.name) 
} 

$.each(manyOfThem, function(index, item) { 
    var obj = new MyClass(item); 
    obj.doSomething() 
}); 

デモ:Fiddle