我创建了一个名为Cat的构造函数。 var fluffy
就是一个例子。
我试图将品种的默认值设置为虎斑。但是当我退出时,毛茸茸的品种是不确定的。
'use strict';
function Cat(name, age, breed) {
this.name = name,
this.age = age,
this.breed = breed
}
Cat.prototype.breed = "tabby";
var fluffy = new Cat ("Fluffy the 3rd", "4 years");
console.log(fluffy);
控制台结果:
Object { name: "Fluffy the 3rd", age: "4 years", breed: undefined }
答案 0 :(得分:1)
Javascript中的函数不要求您传入定义函数的确切参数集。所以这很好:
function f() {
console.log(arguments); // prints "1 2 3"
}
f(1, 2, 3);
这就是:
function g(a, b, c) {
console.log(a, b, c); // prints "undefined undefined undefined"
}
g();
如果传递更多参数而不是参数(第一种情况),则只能通过arguments
数组访问它们。
如果传递更少的参数而不是参数(第二种情况,以及您的问题中的情况),那么这些参数将在函数内部为undefined
。
这就是为什么你得到breed: undefined
:当你致电Cat
时,你没有通过一个品种,而且与大多数语言不同,Javascript没有给你一个错误,它只是将breed
参数绑定到undefined
。
答案 1 :(得分:0)
这是因为您没有将值传递给breed
参数,因此它会覆盖Cat.prototype.breed = 'tabby'
this.breed =
参数值为undefined
。
也许你想这样做:
'use strict';
function Cat(name, age, breed) {
this.name = name; this.age = age;
if(breed || breed === 0)this.breed = breed;
}
Cat.prototype.breed = 'tabby';
var fluffy = new Cat('Fluffy the 3rd', '4 years');
console.log(fluffy);
答案 2 :(得分:0)
由于您没有将品种参数传递给Cat构造函数,因此JavaScript会将breed
视为构造函数中的undefined
。问题是,将undefined
分配给this.breed
的效果与根本不分配它的效果略有不同。
要查看差异,请尝试使用delete
从fluffy
对象中删除该属性:
'use strict';
function Cat(name, age, breed) {
this.name = name,
this.age = age,
this.breed = breed
}
Cat.prototype.breed = "tabby";
var fluffy = new Cat ("Fluffy the 3rd", "4 years");
console.log(fluffy.breed); // logs "undefined"
delete fluffy.breed;
console.log(fluffy.breed); // logs "tabby"
要使用原型执行此操作,您需要在构造函数中使用if / then逻辑:
function Cat(name, age, breed) {
this.name = name;
this.age = age;
if (breed) {
this.breed = breed;
}
}
但是,在构造函数中分配默认值可能最简单。
function Cat(name, age, breed) {
this.name = name;
this.age = age;
this.breed = breed || 'tabby';
}
(请注意,这不会让this.breed
成为假设的值,例如&#34;&#34;或0,所以请注意您想要允许的值范围。)< / p>