Javascript设置对象选项

时间:2012-07-31 17:13:58

标签: javascript jquery oop object

当我使用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);

我刚收到一些来自控制台的未定义消息。任何人都可以告诉我如何创建一个对象,然后像上面的例子一样改变它的属性?

由于

6 个答案:

答案 0 :(得分: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来获取财产。

答案 1 :(得分: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

答案 2 :(得分:0)

你可以像这样创建默认参数(使用jQuery)

var Egg = function(props){
    this.options= {
        status: "cooked",
        make: "Happy Egg"
    }
    $.extend(this.options, props);
};

答案 3 :(得分: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"}
}

此代码允许您拥有一些可以通过参数展开/覆盖的默认对象。

答案 4 :(得分:0)

对于简单的Egg对象,您需要使用函数来接受用于设置结果对象属性的参数:

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

当然,这是一个极其简化的版本。理想情况下,您可能希望使用extend函数,例如jQuery或下划线提供的函数。

答案 5 :(得分: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示例