【问题标题】:Set a javascript object property while calling a method that relies on it在调用依赖它的方法时设置 javascript 对象属性
【发布时间】:2012-06-28 03:02:44
【问题描述】:

这是我正在尝试做的一个非常蹩脚的例子。这段代码有效。

var Love = {
  name: 'Johnny',
  kiss: function (girl){
    alert(this.name + " kissed " + girl );
  }
};

Love.name = "Chris";
Love.kiss("Becky");

我先重新赋值了name的属性,然后调用了发送我的参数的方法

我真正想做的是在调用方法时使用 JSON 设置“名称”属性。我发誓我在某个地方看到过它,但我无法弄清楚。所以理想情况下它应该是这样的。

Love.kiss({
  name: 'Chris'},
  "Becky");

甚至是这样的。

var Love = {
  Guy: 'Johnny',
  Girl: 'Mallory',
  kiss: function (){
    alert(this.Guy + " kissed " + this.girl);
  }
};

Love.kiss({
  Guy: 'Chris',
  Girl; 'Becky'});

再一次,我知道这是一个非常愚蠢的例子,但是这个概念有一个我想使用的应用程序。

【问题讨论】:

    标签: javascript function object properties methods


    【解决方案1】:

    只需遍历作为参数传入的对象的键并将它们分配给this

    var Love = {
        Guy: 'Johnny',
        Girl: 'Mallory',
        kiss: function(opts) {
            for (var k in opts) {
                this[k] = opts[k];
            }
            alert(this.Guy + " kissed " + this.Girl);
        }
    };
    
    Love.kiss({
        Guy: 'Chris',
        Girl: 'Becky'
    });​  // -> alert('Chris kissed Becky')
    

    See demo

    【讨论】:

    • 正是我想要的。非常感谢!
    • 注意:您可能还想将for 循环包装在if (typeof opts !== 'undefined') 中,这样您也可以在没有参数的情况下调用Love.kiss()
    【解决方案2】:

    你还是想将一个对象文字(不是 JSON!)传递给函数,那么为什么不直接使用它呢?

    function kiss(obj) {
        alert(obj.Guy + " kissed " + obj.Girl);
    }
    
    kiss({
        Guy: 'Chris',
        Girl: 'Becky'
    });
    

    为什么还要使用Love 对象?

    【讨论】:

    • 这是一个很好的例子。我很高兴你提供了一些反馈。我想我想要拥有爱对象的唯一原因是,如果在通话期间没有设置任何内容,我可以设置“默认”属性。
    • 如果需要,您可以在kiss 中添加默认值。如果您决定保留该对象,@mVChr 的解决方案也应该有效。
    • 是的@mVChr 的解决方案正是我所需要的。接受我发送的任何值,但也将使用默认值执行该功能。你们都非常有帮助。
    【解决方案3】:
    var Love = {
      Guy: 'Johnny',
      Girl: 'Mallory',
      kiss: function( data ) {
        this.Guy = data.Guy;
        this.Girl = data.Girl;
        alert(this.Guy + " kissed " + this.Girl);
      }
    };
    
    Love.kiss({
      Guy: 'Chris',
      Girl: 'Becky'
    });
    

    这是你想要达到的目标吗?

    【讨论】:

    • 感谢您的意见,这是一个有用的演示,也是预期的结果。
    【解决方案4】:
    var Love = {
      Guy: 'Johnny',
      Girl: 'Mallory',
    
      kiss: function (obj){
        // if you want default values you can use ||
        this.Guy = obj.Guy || this.Guy;
        this.Girl = obj.Girl || this.Girl;
    
        alert(this.Guy + " kissed " + this.Girl);
    
        // or change the code above to the following if you don't want to store new values
        var guy = obj.Guy || this.Guy,
            girl = obj.Girl || this.Girl;
    
        alert(guy + " kissed " + girl);
      }
    };
    
    Love.kiss({
      Guy: 'Chris',
      Girl: 'Becky'
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      相关资源
      最近更新 更多