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
时,它的值是多少?因为您正在扩展父对象,而不是重写其类变量。因此,在扩展范围内仍然可以访问类变量