如何写出类似Person.run().say()...这样可以连贯操作的方法
为何会写这样的内容,起因是因为之前去面试的时候一家公司给出的面试题里出现了这样的。当时看的时候或许是因为时间紧迫或许是自身知识储备不精的问题,没有写出来。由于是内推的公司,其实我没去做试题,而是直接要求的面谈和实战操作,以便减少不必要的时间成本。
不多说,一开始看到这样的,肯定能想到javascript的继承与原型链,但只想到这个还不够的。你只能让Person对象run一次,后面的say则会报TypeError。
来看下栗子:1
2
3
4
5
6
7
8
9
10
11
12
13
14let human = function() {
this.name = 'human';
};
human.prototype = {
run: function () {
console.log('1km');
console.log(this);
},
say: function () {
console.log('I\'m ' + this.name);
}
};
let Person = new human();
Person.run().say();
嗯,这样肯定是不行的,say的调用找不到正确的爸爸了,那么是谁在调用say?是human,而human是不能够调用自身的say方法的。human的原型是谁?是Object,Object上面并没有say方法可以供human继承。
So,这里就涉及到 javascript 中 this 的理解和正确调用的问题了。想要Person.run()正确调用say,那么在run里面就必须返回Person,只有Person继承了human的say。所以,代码应该这样改:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16let human = function() {
this.name = 'human';
};
human.prototype = {
run: function () {
console.log('1km');
console.log(this);
return this; // 关键在这里 return this,把this返回
},
say: function () {
console.log('I\'m ' + this.name);
return this; // 关键在这里 return this,把this返回
}
};
let Person = new human();
Person.run().say();
好了,写代码总会碰到很多奇奇怪怪的问题,不过只要会去思考,应该是没什么困难的。给自己打call!!!