实现1.add(1).add(2).add(3)……的级联叠加
2015-09-18 13:52
465 查看
最近在面试的时候,面试官问我:“1.add(1).add(2).add(3)...我希望这样来实现数的叠加求和,你告诉我怎么实现?”
我哑口无言。回来经过不断的调试,终于被我找到了实现的方法。
首先,要和大家说的是,1.add(1).add(2)是绝对实现不了的。为什么呢?因为1它不是一个对象,直接运行此代码,会报“语法错误”。
所以,
问题1:如何将1转变为对象。
经过测试,我所想到的方法为:直接new一个新的Number对象出来,使用方法为:
用new Number(1)替换单独的1,才可实现调用。
问题1解决了,我们来看看问题2。
问题2:add方法应该放在哪里?
在实现add()方法的时候,脑海里面第一时间想到的实现方法是:
但是很要命的是,这个方法根本无法执行。
意思是,add()方法不存在。
其实这是必然的,因为我们的add()没有放在正确的位置上。
其实我们应该将add放在Number.prototype中,这样才可以让number对象调用到add方法。
好的,我们完成了问题2,接下来是问题3。
问题3:如何调用this。
在一开始的时候,我曾想过这样实现多变量相加。
但是最终结果却是报错。
其实原因在于:this不能被修改。因此请不要尝试在等号左边放上this,这样必然会报错。
所以最终应该如此实现:
问题4:如何实现级联调用。
所谓的级联调用,就是指add(1).add(2).add(3)……,类似的一直无限的调用。
要实现的方法很简单,只需要在add()方法的最后加上一句:
最终的实现代码如下:
我哑口无言。回来经过不断的调试,终于被我找到了实现的方法。
首先,要和大家说的是,1.add(1).add(2)是绝对实现不了的。为什么呢?因为1它不是一个对象,直接运行此代码,会报“语法错误”。
所以,
问题1:如何将1转变为对象。
经过测试,我所想到的方法为:直接new一个新的Number对象出来,使用方法为:
new Number(1).add(1).add(2);
用new Number(1)替换单独的1,才可实现调用。
问题1解决了,我们来看看问题2。
问题2:add方法应该放在哪里?
在实现add()方法的时候,脑海里面第一时间想到的实现方法是:
var add = function(n){ return this + n; }
但是很要命的是,这个方法根本无法执行。
意思是,add()方法不存在。
其实这是必然的,因为我们的add()没有放在正确的位置上。
其实我们应该将add放在Number.prototype中,这样才可以让number对象调用到add方法。
Number.prototype.add = function(){ return this + n; }
好的,我们完成了问题2,接下来是问题3。
问题3:如何调用this。
在一开始的时候,我曾想过这样实现多变量相加。
<pre name="code" class="javascript"><pre name="code" class="javascript">Number.prototype.add = function(){ var i; for(i = 0; i < arguments.length; i++){ this += arguments[i]; } return this; }
但是最终结果却是报错。
其实原因在于:this不能被修改。因此请不要尝试在等号左边放上this,这样必然会报错。
所以最终应该如此实现:
Number.prototype.add = function(){ var i, sum = 0; for(i = 0; i < arguments.length; i++){ sum += arguments[i]; } return this + sum; }
问题4:如何实现级联调用。
所谓的级联调用,就是指add(1).add(2).add(3)……,类似的一直无限的调用。
要实现的方法很简单,只需要在add()方法的最后加上一句:
return this;如此便可实现级联调用。
最终的实现代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
Number.prototype.add = function(){ var i, sum = 0; for(i = 0; i < arguments.length; i++){ sum += arguments[i]; } return this + sum; }
alert(new Number(1).add(2,3,4,5)); //15
</script>
</body>
</html>
相关文章推荐
- X264 利用MinGW 在windows 下的编译
- struts2请求的URL的搜索路径的顺序概述
- shell中if做比较
- 数字如何转换成ASCII码字符――谭浩强C课后题4.9
- iOS学习内容总结
- C++中string的用法 string字符串的使用方法
- Contains Duplicate II
- Random产生随机数问题
- org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML doc
- 迷宫最短路径问题
- Test:开通博客
- 结对博客(Java通信项目QQ)
- 阅读 LdrInitializeThunk
- js实现图片旋转
- 就写个外键
- 时间序列模型之灰度模型
- ubuntu12.04 set python-pandas
- iOS9适配必看指南
- 二 Schema简介
- BigDecimal.setScale 处理java小数点