不确定为什么方法吐出吐出的东西

时间:2013-02-17 10:58:36

标签: javascript object methods constructor prototype

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

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 construcor制造的物品的名称吗? 巧克力不是我们为chocolate.name参数指定的,但名称是。既然我们传递了一个空的参数字段,为什么我们得到“巧克力”而不是回名?

3 个答案:

答案 0 :(得分: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]的函数内可用。

答案 1 :(得分: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的值,即巧克力

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

希望这是有道理的。