创建"默认"构造函数的值与原型?

时间:2017-04-06 00:24:02

标签: javascript

我创建了一个名为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 }

3 个答案:

答案 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的效果与根本不分配它的效果略有不同。

要查看差异,请尝试使用deletefluffy对象中删除该属性:

'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>