不一样的Javascript(11)——函数与对象
来源:互联网 发布:2017十大网络流行语 编辑:程序博客网 时间:2024/05/29 14:43
1. 每个函数都是对象,因此函数上可以定义自己的属性。例如:
test.counter = 0;function test() { console.log(test.counter); test.counter++;}test(); // 0test(); // 1test(); // 2
这样counter的值在多次调用函数test的时候能够保存下来,又避免了定义不必要的全局变量。
函数还可以把自己当作成一个数组对象,从而往自己身上存取多个数据。例如:
function fibonacci(n) { if(fibonacci[n - 2] === undefined) { fibonacci[n - 2] = fibonacci(n - 2); } if(fibonacci[n - 1] === undefined) { fibonacci[n - 1] = fibonacci(n - 1); } return fibonacci[n - 1] + fibonacci[n - 2];}fibonacci[0] = 0;fibonacci[1] = 1;console.log(fibonacci(10)); // 55console.log(fibonacci(50)); // 12586269025
如果直接递归求fibonacci数列,由于有很多重复的计算将导致计算效率极低。为了避免重复计算,一个办法是把已经计算得到的中间结果缓存起来。在上述代码中,中间结果缓存在函数自身的数组中。
2. 如果往构造函数上添加属性,还能实现类似于C++/Java上的静态变量和静态函数。例如如下例子:
function Account(name) { this.name = name; this.id = Account.nextId++; } Account.nextId = 100; Account.prototype.toString = function() { return "Name is: " + this.name + "; id is: " + this.id + "."; } var accountA = new Account("Harry"); var accountB = new Account("Peter"); console.log(accountA.toString()); // Name is: Harry; id is: 100. console.log(accountB.toString()); // Name is: Peter; id is: 101.
在上述代码中,我们通过构造函数Account创建对象。我们希望每个对象的id属性都不一样。这个id属性通过Account.nextId生成。此时,Account.nextId就相当于是类型Account的一个静态变量。
在看一个往构造函数添加变量和函数的例子:
function Complex(real, imaginary) { this.r = real; this.i = imaginary; } Complex.prototype.add = function(that) { return new Complex(this.r + that.r, this.i + that.i);};Complex.prototype.toString = function() { return "{" + this.r + ", " + this.i + "}";};Complex.parse = function(s) { try { var m = Complex._format.exec(s); return new Complex(parseFloat(m[1]), parseFloat(m[2])); } catch (x) { throw new TypeError("Can't parse \"" + s + "\" as a complex number."); }};Complex._format = /^\{([^,]+),([^}]+)\}$/;var complex1 = Complex.parse("{1, 2}");var complex2 = Complex.parse("{5, 3}");var result = complex1.add(complex2);console.log(result.toString()); // {6, 5}在上面的代码中,Complex._format相当于类型Complex的静态变量,而Complex.parse相当于类型Complex的静态函数。
0 0
- 不一样的Javascript(11)——函数与对象
- 不一样的JavaScript(4)——函数参数
- 不一样的JavaScript(6)——函数调用
- 不一样的Javascript(10)——函数嵌套
- 不一样的Javascript(13)——模块化与命名空间
- 不一样的JavaScript(1)——循环
- 不一样的JavaScript(2)——属性
- 不一样的JavaScript(3)——比较
- 不一样的JavaScript(5)——变量作用域
- 不一样的JavaScript(7)——数组
- 不一样的Javascript(8)——基本语法
- 不一样的Javascript(9)——基本类型
- 不一样的Javascript(12)——prototype
- 不一样的Javascript(14)——继承
- JavaScript面向对象(2)——创建对象的工厂模式与构造函数模式
- 不一样的Python(7)——函数
- JavaScript面向对象(2)——函数与闭包(函数、对象、闭包)
- javascript 函数与对象
- Flex 根据选择隐藏某个组件
- SYBASE ASE 常见配置探究及推荐值(完善中)
- jQuery 遍历 - 同胞
- linux Crontab 使用 --定时任务
- java7 默认垃圾回收器
- 不一样的Javascript(11)——函数与对象
- 多正则表达式匹配工具 的用法
- centos 6.2 虚拟机复制时,网卡不启动问题
- Android 手动显示和隐藏软键盘
- session详解
- HTML5画布与KineticJS拖放一组
- java中Set的简单用法
- 第七章 注解式控制器的数据验证、类型转换及格式化 SpringMVC数据类型转换
- HTML5画布互动构建地图