--- id: 587d7dae367417b2b2512b79 challengeType: 1 forumTopicId: 18235 title: 扩展构造函数以接收参数 --- ## Description
上一个挑战中BirdDog构造函数运行得不错。但是,注意到没有:所有通过Bird构造函数创建出来的实例Birds都自动的取名为 Albert,颜色都是蓝色,还都有两条腿。如果你想要新创建出来的小鸟们拥有不同的名字和颜色要怎么办呢?当然,手动的去修改每一个小鸟实例自己的属性也是可以实现的,只是会增加很多无谓的工作量: ```js let swan = new Bird(); swan.name = "Carlos"; swan.color = "white"; ``` 假如你写了一个程序来追踪一个鸟舍里面的几百只甚至几千只不同的小鸟,你将会花费很多时间去创建所有的小鸟实例并给它们的属性一一修改为不同的值。 为了减轻创建不同Bird对象的工作量,你可以给你的Bird设置为可以接收参数的构造函数: ```js function Bird(name, color) { this.name = name; this.color = color; this.numLegs = 2; } ``` 然后将值通过参数的方式传递给Bird构造函数来定义每一个唯一的小鸟实例: let cardinal = new Bird("Bruce", "red"); 这给Bird的名字和颜色属性分别赋值为 Bruce 和红色提供了另外一种方法。但numLegs属性被默认赋值为 2。 cardinal有以下这些属性: ```js cardinal.name // => Bruce cardinal.color // => red cardinal.numLegs // => 2 ``` 这样一来构造函数就变得很灵活了。现在可以直接定义每个Bird实例在创建时的属性,这是 JavaScript 构造函数非常实用的用法之一。它们根据共同或相似的属性和行为将对象归纳为一组,并能够自动的创建各自实例。
## Instructions
创建另一个Dog构造函数。这一次,给它设置两个参数:namecolor,同时给numLegs赋值为 4。然后创建一个新Dog实例保存为变量名:terrier,再将两个字符串通过参数的形式传入namecolor属性。
## Tests
```yml tests: - text: Dog应该接收一个name参数。 testString: assert((new Dog('Clifford')).name === 'Clifford'); - text: Dog应该接收一个color参数。 testString: assert((new Dog('Clifford', 'yellow')).color === 'yellow'); - text: Dog应该有一个numLegs属性且值为 4。 testString: assert((new Dog('Clifford')).numLegs === 4); - text: terrier应该是通过Dog构造函数创建的。 testString: assert(terrier instanceof Dog); ```
## Challenge Seed
```js function Dog() { } ```
## Solution
```js function Dog (name, color) { this.numLegs = 4; this.name = name; this.color = color; } const terrier = new Dog(); ```