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