【问题标题】:Unsure why method is spitting out what its spitting out不确定为什么方法会吐出它吐出的东西
【发布时间】:2013-02-17 10:58:36
【问题描述】:

这似乎是一个愚蠢的问题,但是...
如果我们有一个构造函数:

function Candy(name) {
    this.name = name;
}

我们扩展了Candy这个对象的原型:

Candy.prototype.printName = function(name) {
    console.log(this.name);
};

然后我们从 Candy 构造函数中创建一个新对象,并为这个新对象运行继承的方法:

var chocolate = new Candy("chocolate");
chocolate.printName();

对于我们为什么将巧克力作为输出,这不是我的想法。
当我们从构造函数创建巧克力对象时,我们本质上是这样做的:

var chocolate = new Candy();
chocolate.name = name;  

如果是这样,为什么当我们运行时:

chocolate.printName();  

有一个空白参数,它会吐出:“巧克力”?
巧克力不就是我们用 Candy 构造器构建的对象的名称吗?
例如,巧克力不是我们指定的巧克力名称参数,而是名称。既然我们传递了一个空的参数字段,为什么我们得到的是“巧克力”而不是名字呢?

【问题讨论】:

  • 为什么在这里将参数传递给printName 很重要?您还没有使用printName 中传递的参数的值。另外,当您将name 分配给chocolate.name 时,它的值是多少?
  • 因为您正在扩展父对象而不是覆盖其类变量。因此,类变量仍可在扩展范围内访问

标签: javascript object methods constructor prototype


【解决方案1】:

从不使用printName 方法中的参数name。要使用您指定的签名调用该方法,您可以这样做:

chocolate.printName("Fudge");

这会将字符串 "Fudge" 作为参数 name 发送到方法中,但该参数将被忽略,它仍会打印出您为对象指定的名称。

Javascript 允许您使用任意数量的参数调用任何函数。如果你使用的参数太少,其余的参数将只有undefined的值,如果你使用太多的参数,它们将在arguments集合中,但它们不会放在参数变量中。

因此,如果您调用chocolate.printName();,参数name 将具有值undefined。如果您调用chocolate.printName(1,2,3),则参数name 将具有值1,而其他值将在函数内作为arguments[1]arguments[2] 可用。

【讨论】:

    【解决方案2】:

    我不确定您到底在寻找什么,但如果您添加以下prototype 函数

    Candy.prototype.compare = function (obj) {
      console.log(this === obj);
    }
    
    var chocolate = new Candy();
    

    然后调用它,

    chocolate.compare(chocolate);
    

    它将打印为 true。所以,当你赋值时

    chocolate.name = name; // Asuming name = 'chocolate'
    

    chocolate.printName(); 将始终打印name 的值,即巧克力

    【讨论】:

      【解决方案3】:

      因为你这样做:

      var chocolate = new Candy("chocolate"); // "chocolate" is your argument here
      

      在你的 Candy 构造函数中,参数被获取并分配给this.name...

      function Candy(name) {
         this.name = name; // name is "chocolate" if we use the above
      }
      

      然后printname 方法将只返回“chocolate”,因为它只是从 Candy 对象中记录 this.name,您将其定义为传递给 Candy() 构造函数的任何参数。

      希望这是有道理的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-05
        • 2020-06-12
        • 2021-05-21
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多