不知道为什么这个方法会吐出它吐出的东西

Unsure why method is spitting out what its spitting out

本文关键字:为什么 方法 不知道      更新时间:2023-09-26

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

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();  

伴随着一个空白的论点,它吐出:"巧克力"
巧克力不就是我们用糖果结构构建的物体的名字吗
和中一样,chocolate.name参数不是我们指定的,而是name。既然我们通过了一个空的参数字段,为什么我们得到了"chocolate"而没有返回name?

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]可用。

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

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

称之为

chocolate.compare(chocolate);

它将打印真实。因此,当您指定值时

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

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

因为你这样做:

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()构造函数的任何参数。

希望这是有道理的。