易截截图软件、单文件、免安装、纯绿色、仅160KB

JavaScript面向对象程序设计(6): 封装

 本博客转载于:http://devbean.javaeye.com/blog/407517
封装是面向对象的重要概念之一。如果一个程序没有封装性,也就谈不上什么面向对象。但是,JavaScript并不像其他的语言,比如Java,有公有变量和私有变量等;在JavaScript中只有一种作用域:公有作用域。在本章中,我们将会见识到JavaScript是如何实现封装的特性的。
1. this和公有变量
首先需要理解this关键字。看下面的一段代码,你应该对此感到熟悉:
Js代码
function Person(name, age) {
this.name = name; // 定义一个公有变量
this.age = age;
this.show = function() { // 定义一个公有函数
alert("name: " + name + "; age: " + age);
}
}
var bill = new Person("Bill", 20);
alert(bill.name);
bill.show();
这里的this关键字是必不可少的。前面只是让大家记住,那么为什么要这样呢?想想JavaScript的对象,JavaScript的对象类似于散列,一个<string, object>键-值对的集合。这里的对象的属性实际上都是离散的,并不像其他的语言那样绑定到一个对象上面。this关键字指代的是属性或者函数的调用者,也就是说,谁调用这个属性或者函数指的就是谁。可以看到,这里的this和Java或者C++的this是有所不同的,后者的this是指属性或者函数所在的那个对象本身。而这里this的作用就是将它后面跟着的属性或者对象绑定到调用者上面。回忆一下JavaScript的new的过程,首先将创建一个空的对象,然后使用构造函数初始化这个对象,最后返回这个对象。在这个过程中,JavaScript将把this用这个对象替换,也就是把对象和这些属性或函数相关联,看上去就像是这个调用者拥有这个属性或者函数似的,其实这是this的作用。
这样看来,show里面的name和age并没有关键字,但也是可以正常的执行就会明白怎么回事了——因为前面已经用this把name和age与这个对象bill相关联,并且,show也关联到这个bill变量,因此JavaScript是可以找到这两个变量的。
这样来看,似乎由this修饰的都是公有变量。事实确实如此,如果你要使一个变量成为公有变量,可以使用this。像上面代码中的name和age都是公有变量,在外面使用aPerson.name或者aPerson.age就可以访问到。
2. 私有变量
怎么声明一个私有变量呢?事实上就像前面说的,JavaScript根本没有私有作用域这一说。那么来看下面的代码:
Js代码
function Person(name, age) {
var name = nam


相关文档:

javascript 的lastIndexOf

近日收集上万行代码,整理一些出来。
//V8引擎的实现
function ToInteger( n ) {
n = Number( n );
var sign = ( n < 0 ) ? -1 : 1;
if ( n != n ) {
return 0;
}
if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY ) {
......

Javascript Best Practices

1. 总是使用 ‘var’
在JavaScript
中,变量不是全局范围的就是函数范围的,使用”var”关键词将是保持变量简洁明了的关键。当声明一个或者是全局或者是函数级(function-level)的变量,需总是前置”var”关键词,下面的例子将强调不这样做潜在的问题。
不使用 Var 造成的问题
var i=0; ......

javascript小技巧

javascript小技巧
事件源对象
event.srcElement.tagName
event.srcElement.type
捕获释放
event.srcElement.setCapture(); 
event.srcElement.releaseCapture(); 
事件按键
event.keyCode
event.shiftKey
event.altKey
event.ctrlKey
事件返回值
event.returnValue
鼠标位置
event ......

Javascript的caller到底是什么时候定义的呢?

 网上很多文章都转载了一段话:对于函数来说,caller 属性只有在函数执行时才有定义。
到底是不是呢?可以用下面这段代码测试一下(这段例子也是转载文章中使用的):
function callerDemo() {
if (callerDemo.caller) {
var a= callerDemo.caller.toString();
alert(a);
} else {
......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号