Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不确定为什么方法会吐出它吐出的东西_Javascript_Object_Methods_Constructor_Prototype - Fatal编程技术网

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

Javascript 不确定为什么方法会吐出它吐出的东西,javascript,object,methods,constructor,prototype,Javascript,Object,Methods,Constructor,Prototype,这似乎是个愚蠢的问题,但… 如果我们有一个构造函数: function Candy(name) { this.name = name; } 我们扩展了这个对象的原型: Candy.prototype.printName = function(name) { console.log(this.name); }; 然后,我们从Candy构造函数创建一个新对象,并为此新对象运行继承的方法: var chocolate = new Candy("chocolate"); chocol

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

function Candy(name) {
    this.name = name;
}
我们扩展了这个对象的原型:

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不是我们指定的chocolate.name参数,而是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()
构造函数的任何参数


希望这是有意义的。

我不确定您到底在寻找什么,但如果您添加以下
原型
功能

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

var chocolate = new Candy();
就叫它

chocolate.compare(chocolate);
它将打印为真。所以,当你赋值的时候

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

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

方法中的参数
名称
从不使用。要使用指定的签名调用方法,请执行以下操作:

chocolate.printName("Fudge");
这将把字符串
“Fudge”
作为参数
name
发送到方法中,但该参数被忽略,它仍然打印出您为对象指定的名称

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


因此,如果调用
chocolate.printName()
,参数
名称
的值将为
未定义
。如果调用
chocolate.printName(1,2,3)
,则参数
name
的值将为
1
,其他值将在函数中作为
arguments[1]
arguments[2]

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