FreeCodeCamp 高级算法题 - 构造对象

构造对象 (Make a person)

题目链接

问题解释

  • 不同于其他题目,在这道题中,我们需要写一个构造函数。这个构造函数接收一个字符串参数 firstAndLast
  • 如果 str"Bob Ross",则构造出实例的全名为 “Bob Ross”,姓氏为 “Ross”,名字为 “Bob”

解题思路

  • 这道题其实难度很小。如果你熟悉 “构造器” (constructor) 的概念,以及 JavaScript 中的 new 操作符,那代码很快就可以写出来
  • 简单来说,在 JavaScript 中,构造器就是一个函数 (但函数可以不用作构造器)。比如题目中给出了:
1
var bob = new Person('Bob Ross');
  • 也就相当于用 new 操作符调用 Person 构造器,并把返回值赋值给变量 bob,会发生以下三件事:

    1. 创建一个对象,这个对象的原型继承自 Person.prototype
    2. 对象拥有 Person 函数中用 this 定义的属性或方法
    3. 如果 Person 函数本身又返回值,那这个返回值就会赋值给 bob。否则,就把第一步创建的对象赋值给 bob
  • 题目中,第一个测试实例说到,Object.keys(bob).length 应该返回 6。这句话的意思是,我们只应该给实例绑定题目中列出的六个方法。至于传入的 firstAndLast,虽然这就是全名,但我们也不应该用 this 把这个值绑定给实例

  • 需要注意的是,如果用 prototype 给构造函数添加属性,那么生成的实例是可以通过属性名来获取到对应的值的。而且,这个属性不会直接出现在实例中,而是藏在 __proto__ 属性里面,而 Object.keys 是不会计算 __proto__ 原型对象中的属性的。在这道题目中,我们其实不需要去折腾原型链。只要把名字作为局部变量放在构造函数里就可以了
  • 根据题目要求,有时候我们需要返回全名,有时候我们只需要返回姓或名。因此,比较简单的处理方式就是把姓和名放到数组中来保存,如果需要返回全名,直接 join 一下就可以了
  • 为了方便,我们也可以把全名作为字符串赋值给一个局部变量。当然,如果这样做,更新的时候不要忘了同时更新这个变量和数组

参考资料

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var Person = function(firstAndLast) {
var nameArr = firstAndLast.split(' ');

this.getFirstName = function() {
return nameArr[0];
};
this.getLastName = function() {
return nameArr[1];
}
this.getFullName = function() {
return nameArr.join(' ');
}

this.setLastName = function(lastName) {
nameArr[1] = lastName;
}
this.setFirstName = function(firstName) {
nameArr[0] = firstName;
}
this.setFullName = function(fullName) {
nameArr = fullName.split(' ');
}
}

var bob = new Person('Bob Ross');
文章目录
  1. 1. 构造对象 (Make a person)
    1. 1.1. 题目链接
    2. 1.2. 问题解释
  2. 2. 解题思路
    1. 2.1. 参考资料
    2. 2.2. 代码
,