【问题标题】:Javascript setting object optionsJavascript 设置对象选项
【发布时间】:2012-07-29 12:55:04
【问题描述】:

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

我刚从控制台收到一堆未定义的消息。谁能告诉我如何创建一个对象,然后像上面的例子一样改变它的属性?

谢谢

【问题讨论】:

  • 这段代码不可能工作,因为你传递给构造函数的参数被忽略了

标签: javascript jquery oop object


【解决方案1】:

您的构造函数没有接受任何参数,但您在创建新实例时将它们传入。

你会想要的

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 即可获得该属性。

【讨论】:

  • this.make: props.make || "Happy Egg"; 这一行看起来像是您混淆了 JavaScript 赋值和 JSON 格式。 ?
  • 我想说我的方法(见下文)更动态,更常用
  • 我不喜欢对所有事情都使用 jquery。如果您唯一的工具是锤子,那么每个问题都是钉子。
  • 完美!谢谢,所以它只是创建一个以对象文字作为参数的构造函数。
【解决方案2】:

试试这个:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        我做了一个例子,我构造一个对象,然后通过将参数传递给构造函数来覆盖它的值,就像在滑块对象中一样。该示例与您的示例不完全相同,但更多的是您询问的滑块示例

        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 示例

        【讨论】:

          【解决方案6】:

          您必须在函数中添加一些代码,将参数值分配给新对象的属性。此外,如果您有一些默认值,您应该将它们放入原型中,这样可以节省内存。所以使用这个代码:

          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"}
          }
          

          这段代码让你有一些可以被参数扩展/覆盖的默认对象。

          【讨论】:

          • 但这会改变每个创建实例的属性,不是吗?
          • 不,不会。构造函数只作用于this,这是正在创建的实例。 Egg.prototype={...} 部分只定义了Egg 类的prototype
          • 嗯,我错过了什么吗?当我实例化一个 Egg 并通过构造函数设置状态,然后通过原型更改状态时,我实例化对象的状态参数也会发生变化。 jsfiddle.net/UPwUq
          • 是的,当然。如果您更改原型中的某些内容,它会立即更改在所有情况下都没有覆盖该属性的内容。因此,如果您想更改某些内容,请更改对象,而不是原型。另外,刚刚注意到上面有一个大喇叭。
          猜你喜欢
          • 1970-01-01
          • 2015-06-08
          • 1970-01-01
          • 1970-01-01
          • 2013-04-11
          • 2015-03-19
          • 1970-01-01
          • 2013-02-09
          • 2023-03-15
          相关资源
          最近更新 更多