原型链-柯里化-记忆缓存
来源:互联网 发布:1个域名指向多个ip 编辑:程序博客网 时间:2024/05/29 13:44
1、 使用原生js实现–原型链使用
(10).add(10).reduce(2).add(10) //28
Number.prototype.add = function(num) { return this + num; } Number.prototype.reduce = function(num) { return this - num; } var res = (10).add(10).reduce(2).add(10); console.log(res);
2、 继承遇到的坑
<script> function Tree(){ } Tree.prototype.moreLeafs=function(){ // this.leaf++; console.log(this); console.log(this.leaf); } Tree.prototype.leaf=2; var t1 = new Tree(); t1.moreLeafs(); t1.moreLeafs(); var t2 = new Tree(); t2.moreLeafs(); t1.leaf == t2.leaf; //false t1.moreLeafs == t2.moreLeafs; //true </script>
答案是:1,2,1。红宝书中有这样一段话:对象实例访问保存在原型中的值,但却不能通过对象实例重写原型中的值。如果我们在实例中添加了一个属性,而该属性与实例原型中的一个属性同名,那我们就在实例中创建该属性,该属性会屏蔽原型中的那个属性。
3、函数柯里化
如下代码:var fn=function(a,b,c){ return a+b+c;}需要写一个函数,满足curry(fn)(1)(2)(3) //6
这题很明显,考察函数的柯里化,函数的柯里化还不懂是啥的童鞋可以看这里。
按照题目的要求需要把fn作为第一个参数传进去,而且给出结果刚好是fn运算后给出的结果。
所以我的思路是要有一个函数将fn函数所需参数全部集中到一个数组上,集中完毕后调用fn函数,我的代码如下:
var fn = function(a,b,c) { return a+b+c;}function curry(fn) { var arr = [], mySlice = arr.slice fnLen = fn.length; function curring() { arr = arr.concat(mySlice.call(arguments)); if(arr.length < fnLen) { return curring; } return fn.apply(this, arr); } return curring}curry(fn)(1)(2)(3);//6
4、记忆缓存
函数可以将先前操作的结果记录在某个对象里,从而避免无谓的重复运算。主要使用 闭包及缓存数组 实现。
方法一采用类似于jQuery缓存的方法,使用对象存储键值对,用闭包封装起来。对于一些有容量限制的可以做超容处理。
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title></head><body> <script> // 方法一 /* 创建缓存数组 */ function createCache() { var cache = {}; //对象 return function(key, value) { if (value !== undefined) { //如果存在值,则为设置key的值为value cache[key] = value; return cache[key]; } else { //如果value为undefined,则为获取值 return cache[key]; } } } //以斐波那契为例 var count = 0; function fib() { var cache = createCache(); function cacheFib(n) { if (cache(n) !== undefined) { return cache(n); } else { count++; if (n <= 2) { cache(n, 1); return 1; } var temp = cacheFib(n - 1) + cacheFib(n - 2); cache(n, temp); return temp; } } return cacheFib; } var myfib = new fib(); console.log(myfib(9)); //34 console.log(count); //9 </script></body></html>
方法一扩展:超容处理的createCache方法:
/* 创建缓存数组-限制缓存大小 */ function createCache() { var cache = {}; //做缓存对象,以键值对的形式存储 var index = []; //存储键,键有顺序,方便做超容处理 return function(key, value) { if (value !== undefined) { //如果存在值,则为设置key的值为value cache[key] = value; //将键值存储在缓存对象中,做缓存 index.push(key); //将键存储在index数组中,和cache对应 if (index.length >= 50){ //如果超出容量,则删除最早进入缓存的数据 var temp = index.shift(); delete cache[temp]; } return cache[key]; } else { //如果value为undefined,则为获取值 return cache[key]; } } }
方法二来自《js语言精粹》,提供了一个简短精悍的memorizer方法,对于不同的需要记忆的函数可以复用,比如斐波那契函数、阶乘函数。
// --------------------------------方法二:记忆函数-精简写法 var count1=0; var memoizer = function(memo, formula) { var recur = function(n) { var result = memo[n]; if (typeof result !== 'number') { result = formula(recur, n); memo[n] = result; } return result; }; return recur; } //斐波那契函数 var fibonacci = memoizer([0, 1], function(recur, n) { count1++; return recur(n - 1) + recur(n - 2); }); console.log(fibonacci(9)); //34 console.log(count1); //8 //阶乘函数 var factorial = memoizer([1,1],function(recur,n){ return n*recur(n-1); }); console.log(factorial(5)); //120
0 0
- 原型链-柯里化-记忆缓存
- 对JS原型(链)的理解和记忆(一)
- 缓存记忆DOM元素
- 原型与原型链
- 原型 和 原型链
- 原型与原型链
- 原型以及原型链
- JS原型、原型链
- 原型与原型链
- 原型与原型链
- JS-原型、原型链
- 原型、原型链
- JavaScript原型,原型链
- JavaScript-原型、原型链
- 原型和原型链
- 原型与原型链
- 原型与原型链
- 原型、原型链
- Windows版本的Application Loader发布提交iOS应用程序
- iBET Online Casino Bonus ADIDAS YEEZY Lucky Draw(ADIDAS YEEZY, iBET)
- 八.Kafka Consumer和 offset提交
- Oracle trunc()函数的用法
- 认识mvp代码风格
- 原型链-柯里化-记忆缓存
- 重构学习(一)
- JavaMail——进阶
- JavaWeb Apache Shiro 应用
- MSE等名词解释
- Jquery中的DOM操作 (五.包裹节点和属性操作)
- Archive for required library: proxool/proxool/0.9.0RC3/proxool-0.9.0RC3.jar' cannot be read or is no
- Vue模板
- ScrollView怎么判断是否滑动到了底部?