JavaScript 是一种灵活的语言,表达力极强,我来举一个例子,保证让很多人大吃一惊。
首先,在 Number.prototype 对象上,部署一个 add 方法。
Number.prototype.add = function (x) {
return this + x;
};
上面代码为 Number 的实例定义了一个 add 方法。
由于 Number 的实例就是数值,在数值上调用某个方法,数值会自动转为实例对象,所以就得到了下面的结果。
8['add'](2)
// 10
上面代码中,调用方法之所以写成8['add'],而不是8.add,是因为数值后面的点,会被解释为小数点,而不是点运算符。
将数值放在圆括号中,就可以使用点运算符调用方法了。
(8).add(2)
// 10
其实,还有另一种写法。
8..add(2)
// 10
上面代码的第一个点解释为小数点,第二个点解释为点运算符。为了语义清晰起见,下面我统一采用圆括号的写法。
由于add方法返回的还是数值,所以可以链式运算。
Number.prototype.subtract = function (x) {
return this - x;
};
(8).add(2).subtract(4)
// 6
上面代码在Number对象的实例上部署了subtract方法,它可以与add方法链式调用。
如果使用方括号调用属性,写法会很古怪。
8["add"](2)["subtract"](4)
// 6
我们还可以部署更复杂的方法。
Number.prototype.iterate = function () {
var result = [];
for (var i = 0; i <= this; i++) {
result.push(i);
}
return result;
};
(8).iterate()
// [0, 1, 2, 3, 4, 5, 6, 7, 8]
上面代码在 Number 对象的原型上部署了 iterate 方法,可以将一个数值自动扩展为一个数组。
总之,现在我们可以在数值上直接调用方法了,但是后面一对圆括号看着有点碍眼,有没有可能去掉圆括号呢?也就是说,能不能将下面的表达式
(8).double().square()
写成另一种样子?
(8).double.suqare
这是可以做到的。
ES5规定,每个对象的属性都有一个取值方法get,用来自定义该属性的读取操作。
Number.prototype = Object.defineProperty(
Number.prototype, "double", {
get: function (){return (this + this)}
}
);
Number.prototype = Object.defineProperty(
Number.prototype, "square", {
get: function (){return (this * this)}
}
);
上面代码在 Number.prototype 上定义了两个属性 double 和 square ,以及它们的取值方法 get 。
因此,在任一数值上,读取这两个属性,就可以写成下面的样子。
(8).double.square
// 256
也可以改用方括号运算符。
8["double"]["square"]
// 256
一、简单性
JavaScript是一种基于Java基本语句和控制流之上的简单而紧凑的设计,从而对于学习Java是一种非常好的过渡。它的变量类型是采用弱类型,并未使用严格的数据类型。
二、动态性
JavaScript是动态的,它可以直接对用户或客户输入做出响应,无须经过Web服务程序。它对用户的反映响应,是采用以事件驱动的方式进行的。所谓事件驱动,就是指在主页(Home Page)中执行了某种操作所产生的动作,就称为“事件”(Event)。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后,可能会引起相应的事件响应。
三、跨平台性
JavaScript是依赖于浏览器本身,与操作环境无关,只要能运行浏览器的计算机,并支持JavaScript的浏览器就可正确执行。从而实现了“编写一次,走遍天下”的梦想。
四、安全性
JavaScript是一种安全性语言,它不允许访问本地的硬盘,并不能将数据存入到服务器上,不允许对网络文档进行修改和删除,只能通过浏览器实现信息浏览或动态交互。从而有效地防止数据的丢失。