1

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

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 构造器构建的对象的名称吗?
例如,巧克力不是我们指定的巧克力名称参数,而是名称。既然我们传递了一个空的参数字段,为什么我们会得到“巧克力”而不是名字呢?

4

3 回答 3

2

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

chocolate.printName("Fudge");

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

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

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

于 2013-02-17T11:24:39.970 回答
1

我不确定您到底在寻找什么,但是如果您添加以下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,即巧克力

于 2013-02-17T11:23:36.977 回答
0

因为你这样做:

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”,因为它只是this.name从 Candy 对象中记录,您将其定义为传递给Candy()构造函数的任何参数。

希望这是有道理的。

于 2013-02-17T11:21:01.850 回答