这似乎是一个如此愚蠢的问题,但...... 如果我们有一个构造函数:
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参数指定的,但名称是。既然我们传递了一个空的参数字段,为什么我们得到“巧克力”而不是回名?
答案 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>
希望这是有道理的。