1

javaScript プラグインを使用しているとき、プラグインの動作を調整するためのこのアプローチに出くわすことがよくあります。

$('.mySlider').slider({status: "burnt"});

この種のアプローチをそのようなオブジェクトで複製しようとすると

var Egg = function(){

    this.details = {
        status: "cooked",
        make: "Happy Egg"
    }

};



var egg = new Egg({status: "burnt"});
console.log(egg.details.status);

コンソールから未定義のメッセージがたくさん表示されます。上記の例のように、オブジェクトを作成してそのプロパティを変更する方法を教えてもらえますか?

ありがとう

4

6 に答える 6

6

コンストラクターは引数を取りませんが、新しいインスタンスを作成するときに引数を渡しています。

あなたが望むだろう

var Egg = function(props){

    this.details = props;

};

多分

var Egg = function(props){
    props = props || {}; // handle no arguments

    this.status = props.status;
    this.make = props.make || "Happy Egg";
};

次に、プロパティを取得するためだけegg.statusに行います。

于 2012-07-31T17:16:23.680 に答える
1

これを試して:

var Egg = function(details) {
   this.details = {};
   for (var key in details) {
      this.details[key] = details[key];
   }

   return this;
};

var egg = new Egg({ status: 'burnt' }); // burnt

console.log(egg.details.status);

問題は、引数 ( details) をコンストラクターに渡していたが、それらを適切に使用していないことです。私の例ではdetails、空のオブジェクトをデフォルトにして、{}渡された属性をオーバーライドします。

プロトタイプを使用することで、さらに一歩進めることができます。詳細を変更できる関数を公開するとします。

var Egg = function(details) {
   this.details = {};
   for (var key in details) {
      this.details[key] = details[key];
   }

   return this;
};

Egg.prototype.updateDetail = function(name, value) {
    this.details[name] = value;
};

var egg = new Egg({ status: 'burnt' });

console.log(egg.details.status); // burnt

egg.updateDetail('status', 'scrambled');

console.log(egg.details.status); // scrambled
于 2012-07-31T17:20:38.773 に答える
0

オブジェクトを構築し、スライダー オブジェクトのようにパラメーターをコンストラクターに渡すことでその値をオーバーライドする例を作成しました。この例はあなたのものとまったく同じではありませんが、あなたが尋ねたスライダーの例の詳細です

var Egg = function(){
this.status = 'Some';
    this.detail = 'another';
   //the magic line which makes it possible
    for (var n in arguments[0]) { this[n] = arguments[0][n];}

};

var egg = new Egg({status: 'burnt', make: 'hj'});
alert(egg.status );

この行を追加することで

for (var n in arguments[0]) { this[n] = arguments[0][n];}

コンストラクターに対して、ユーザーにデフォルトのパラメーターを変更する柔軟性を与えました。パラメータは任意の順序で指定することも、不要なパラメータを除外することもできます。

これがJSFiddleの例です

于 2012-07-31T17:29:44.280 に答える
0

このようなデフォルトパラメータを作成できます( jQquery を使用)

var Egg = function(props){
    this.options= {
        status: "cooked",
        make: "Happy Egg"
    }
    $.extend(this.options, props);
};
于 2012-07-31T17:18:11.480 に答える
0

引数の値を新しいオブジェクトのプロパティに割り当てるコードを関数に追加する必要があります。また、プロトタイプに入れる必要があるデフォルト値がある場合は、メモリを節約できます。したがって、次のコードを使用します。

function Egg(obj){
  if(typeof obj==="object"){
    this.details={}; //This overwrites the prototype property with one
                     //that's specific to this instance.
    for(i in arguments.callee.prototype.details){
      //This copies object from proto to object
      this.details[i]=arguments.callee.prototype.details[i];
    }
    for(i in object){
      this.details[i]=object[i];
    }
  }
};
Egg.prototype={
    details: {status: "cooked", make: "Happy Egg"}
}

このコードを使用すると、引数によって展開/上書きできるデフォルト オブジェクトを使用できます。

于 2012-07-31T17:18:32.813 に答える
0

単純なEggオブジェクトの場合、結果のオブジェクトの属性を設定するために使用されるパラメーターを受け入れる関数が必要になります。

var Egg = function(options) {
  this.details = {
    status: options.status || 'cooked',
    make: options.make || 'Happy egg'
  }
};

もちろん、これは非常に単純化されたバージョンです。理想的には、extendjQuery やアンダースコアによって提供される関数などを使用することをお勧めします。

于 2012-07-31T17:18:54.223 に答える