» 2009-9-14 16:42:51 已被归档于 JavaScript
面向对象基础
接着上一篇继续今天的笔记:
对象
对象是JavaScript的基础。实际上JavaScript语言中的一切都是对象,JavaScript的多数能力也正起源于此。在其最根本的层面上,对象作为属性的集合存在,差不多类似于你在其它语言中看到的哈希的概念。程序2-19展示了创建两个带有一组属性的对象的基本示例。
程序2-19. 创建简单对象并设置其属性的两个例子
实际上对象就这么回事了。然而,事情变得麻烦的地方,在于新对象(尤其是那些继承其它对象属性的对象)的创建。
对象创建
不像大多数其它面向对象的语言,JavaScript实际上并没有类的概念。在大多数其它的面向对象语言中,你可以初始化一个特定的类的实例,但是在 JavaScript中的情况这是这样。在JavaScript中,对象能够创建新的对象,对象可以从继承自其它对象。整个概念被称为"prototypal inheritance"(原型标本继承),将在"公有方法"一节中有更多论述。
然而,重要的是,不论 JavaScript采用哪种对象方案,总归要有一个方式来创建新的对象。JavaScript的做法是,任何一个函数也都能作为一个对象被实例化。实际上,事情听起来远比它本身更令人困惑。好比有一块生面团(相当于原始的对象),用小甜饼切割器(相当于对象构造器,使用对象的原型prototype)为其成形。
让我们看看程序2-20中这一机制的工作的实例
程序2-20. 创建并使用一个简单的对象
程序2-20说明了constructor属性的使用。这个存在于每一个对象中的属性将总是指向创建该对象的那个函数。于是,你可以方便的复制该对象,创建一个新的有共同基类和不同属性的对象。示例见程序2-21.
程序2-21. 使用constructor属性一例
公有方法
公有方法可以完全地被对象的上下文中的最终使用者访问。为了实现这些对于特定对象的所有实例都可用的公共方法,你需要学习一个名为"prototype"的属性。prototype简单地包含一个对象,为一个父对象的所有新副本充当对基类的引用。本质上,prototype的任何属性对该对象的所每一个实例都是可用的。创建/引用的过程给了我们一个廉价版的继承,这一点我将在第三章论及。
由于对象的prototype 也是一个对象,就跟其它任何对象一样,你可以给它附加新的属性。附加给prototype的新的属性将成为从原来的prototype对象实例化的每个对象的一部分,有效地使得该属性成为公有的(且可为全部实例所访问)。程序2-22展示一个此类例子:
程序2-22. 带有通过prototype附加的方法的对象的例子
私有方法
私有方法和变量只能被其它的私有方法、私有变量的特权方法(下一节将会论述)访问。这是一种定义只能在内象内部访问的代码的方式。这一技术得益于 Douglas Crockford的工作。他的网站提供了大量的详述面向对象的JavaScript的工作机制和使用方法的文档:
JavaScript文章列表:http://javascript.crockford.com/
文章"JavaScript中的私有成员:http://javascript.crockford.com/private.html
我们来看一个私有方法可以怎样应用中的例子,如程序2-23所示.
程序2-23. 私有方法只能被构造函数使用的示例:
尽管很简单,私有方法却是非常重要的,它可以在保持你的代码免于冲突同时允许对你的用户可见和可用的施以更强大的控制。接下来,我们来研究特权方法。它是你的对象中可以使用的私有方法和共有方法的联合
另外还有特权方法,静态方法.请查看原文http://bbs.blueidea.com/thread-2734050-1-1.html
接着上一篇继续今天的笔记:
对象
对象是JavaScript的基础。实际上JavaScript语言中的一切都是对象,JavaScript的多数能力也正起源于此。在其最根本的层面上,对象作为属性的集合存在,差不多类似于你在其它语言中看到的哈希的概念。程序2-19展示了创建两个带有一组属性的对象的基本示例。
程序2-19. 创建简单对象并设置其属性的两个例子
//创建一个新对象并将其存放在obj里
var obj = new Object();
//将该对象的一些属性设置成不同的值
obj.val = 5;
obj.click = function(){
alert( "hello" );
};
//下面是等效的代码,使用了{...}式缩写,
//和定义对象属性的"名称-值"对
var obj = {
//用名称-值对设置对象属性
val: 5,
click: function(){
alert( "hello" );
}
};
实际上对象就这么回事了。然而,事情变得麻烦的地方,在于新对象(尤其是那些继承其它对象属性的对象)的创建。
对象创建
不像大多数其它面向对象的语言,JavaScript实际上并没有类的概念。在大多数其它的面向对象语言中,你可以初始化一个特定的类的实例,但是在 JavaScript中的情况这是这样。在JavaScript中,对象能够创建新的对象,对象可以从继承自其它对象。整个概念被称为"prototypal inheritance"(原型标本继承),将在"公有方法"一节中有更多论述。
然而,重要的是,不论 JavaScript采用哪种对象方案,总归要有一个方式来创建新的对象。JavaScript的做法是,任何一个函数也都能作为一个对象被实例化。实际上,事情听起来远比它本身更令人困惑。好比有一块生面团(相当于原始的对象),用小甜饼切割器(相当于对象构造器,使用对象的原型prototype)为其成形。
让我们看看程序2-20中这一机制的工作的实例
程序2-20. 创建并使用一个简单的对象
copy
code:
code://一个简单的函数,接受一个参数name,
//并将其保存于当前上下文中
function User( name ) {
this.name = name;
}
//用指定的name创建上述函数的新实例
var me = new User( "My Name" );
//我们可以看到name已经被成为对象本身的属性
alert( me.name == "My Name" );
//而且它确实是User对象的一个新实例
alert( me.constructor == User );
//那么,既然User()只是一个函数,
//当我们这么处理它的时候,发生了什么?
User( "Test" );
//因为this上下文没有被设置,它缺省地指向全局的window对象,
//这意味着window.name将等于我们提供给它的那个name
alert( window.name == "Test" );程序2-20说明了constructor属性的使用。这个存在于每一个对象中的属性将总是指向创建该对象的那个函数。于是,你可以方便的复制该对象,创建一个新的有共同基类和不同属性的对象。示例见程序2-21.
程序2-21. 使用constructor属性一例
copy
code:
code://创建一个新的、简单的User对象(函数)
function User() {}
//创建一个新的User对象
var me = new User();
//也是创建一个新的User对象(使用上前一个对象的constructor)
var you = new me.constructor();
//我们可以看到,实际上它们的constructor是同一个
alert( me.constructor == you.constructor );公有方法
公有方法可以完全地被对象的上下文中的最终使用者访问。为了实现这些对于特定对象的所有实例都可用的公共方法,你需要学习一个名为"prototype"的属性。prototype简单地包含一个对象,为一个父对象的所有新副本充当对基类的引用。本质上,prototype的任何属性对该对象的所每一个实例都是可用的。创建/引用的过程给了我们一个廉价版的继承,这一点我将在第三章论及。
由于对象的prototype 也是一个对象,就跟其它任何对象一样,你可以给它附加新的属性。附加给prototype的新的属性将成为从原来的prototype对象实例化的每个对象的一部分,有效地使得该属性成为公有的(且可为全部实例所访问)。程序2-22展示一个此类例子:
程序2-22. 带有通过prototype附加的方法的对象的例子
copy
code:
code://创建一个新的User的构造器
function User( name, age ){
this.name = name;
this.age = age;
}
//为prototype对象添加一个新方法
User.prototype.getName = function(){
return this.name;
};
//为prototype对象添加另一个方法
//注意此方法的上下文将是被实例化的对象
User.prototype.getAge = function(){
return this.age;
};
//实例化一个新的User对象
var user = new User( "Bob", 44 );
//我们可以看到两个方法被附加到了对象上,有着正确的上下文
alert( user.getName() == "Bob" );
alert( user.getAge() == 44 );私有方法
私有方法和变量只能被其它的私有方法、私有变量的特权方法(下一节将会论述)访问。这是一种定义只能在内象内部访问的代码的方式。这一技术得益于 Douglas Crockford的工作。他的网站提供了大量的详述面向对象的JavaScript的工作机制和使用方法的文档:
JavaScript文章列表:http://javascript.crockford.com/
文章"JavaScript中的私有成员:http://javascript.crockford.com/private.html
我们来看一个私有方法可以怎样应用中的例子,如程序2-23所示.
程序2-23. 私有方法只能被构造函数使用的示例:
copy
code:
code://一个表示教室的对象构造器
function Classroom( students, teacher ) {
//用来显示教室中的所有学生的私有方法
function disp() {
alert( this.names.join(", ") );
}
//课程的数据存储在公有的对象属性里
this.students = students;
this.teacher = teacher;
//调用私有方法显示错误
disp();
}
//创建一新的教室对象
var class = new Classroom( [ "John", "Bob" ], "Mr. Smith" );
//失败,因为disp不是该对象的公有方法
class.disp();尽管很简单,私有方法却是非常重要的,它可以在保持你的代码免于冲突同时允许对你的用户可见和可用的施以更强大的控制。接下来,我们来研究特权方法。它是你的对象中可以使用的私有方法和共有方法的联合
另外还有特权方法,静态方法.请查看原文http://bbs.blueidea.com/thread-2734050-1-1.html