作者:Topcss QQ:419074376 E-mail:andpai1.0@gmail.com Time:2008-11月
背景:接触JavaScript快两年了。从最开始对她充满着好奇,到现在的学习了许多关于她的框架。朋友问我:都有这么多框架,你为何还要去学最底层的面向对象呢?其实这个问题:另一个朋友已经替我回答了。无论以后框架在怎么变,只要了解底层的原理,学起来都是很容易上手的。好了,我们开始学习了。
1、
创建对象:
var
obj = new Object();//第一种方式。
var
obj = {};//第二种方法。顺带一句可以通过var arr = [] 来创建数组
2、
给对象的属性赋值
nahao.gender
= 'male';
nahao.yearOfBirth = 1989;
nahao.name
= 'Topcss';
//对象的属性也可以叫做对象的成员。像普通的变量一样,JS对象的属性可以是是字符串,数组,数字,甚至可以是对象或者是函数。
3、
给对象添加方法其实对象的属性如果是函数,那么这个属性就可以叫做对象的方法
nahao.gender
= 'male';
nahao.yearOfBirth = 1989;
nahao.name
= 'Topcss';
nahao.info
= function(){
var str =
'姓名:' +
this.name +
',性别:' +
this.gender +
',出生年:' +
this.yearOfBirth;
alert(str);
}
nahao.info();
4、
我们可以使用下面的简略语法定义上面的对象:
var
nahao = {
gender : 'male',
yearOfBirth :
1989,
name : 'Topcss',
info : function(){
var str =
'姓名:' + this.name
+ ',性别:' + this.gender +
',出生年:' + this.yearOfBirth;
alert(str);
}
};//如果调用nahao.info(),将会得到和上面一样的结果。需要注意的是,属性之间使用逗号隔开,最后一个属性之后没有逗号。
5、
构造函数构造函数可以帮助我们来缩减代码量。首先,构造函数也是一个函数。雏形如下:
function
Person(){}/和定义普通的函数没有什么区别。下面就来向Person构造函数中添加内容:
function
Person(name,gender,yearOfBirth,site){
this.name =
name;
this.gender
= gender;
this.yearOfBirth =
yearOfBirth;
this.site =
site;
this.info
= function(){
var str =
'姓名:' + this.name
+ ',性别:' + this.gender
+ ',出生年:' + this.yearOfBirth + '网站:' + this.site;
alert(str);
}
}//这样,构造函数就完成了。我们现在就可以使用如下语句来定义多个对象了:
var
nahao = new
Person('Top
css',male,1989,'www.javava.org);
var
gaoshou = new
Person('Widen','male',1980,'www.baidu.net');
var
wudi = new
Person('不详','不知道','保密','bbs.blueidea.net');通过他们的方法来调用
nahao.info();
gaoshou.info();
wudi.info();
注意:在上面的构造函数中,参数的名字和对象属性的名字是相同的,例如:
this.name
= name;虽然这样是合法的,但是如果要定义私有属性的话就不行了(后面会提),而且看起来比较混乱。所以最好将构造函数修改如下:
function
Person(nameArg,genderArg,yearOfBirthArg,siteArg){
this.name
= nameArg;
this.gender
= genderArg;
this.yearOfBirth =
yearOfBirthArg;
this.site
= siteArg;
this.info
= function(){
var str =
'姓名:' + this.name
+ ',性别:' + this.gender
+ ',出生年:' + this.yearOfBirth + '网站:' + this.site;
alert(str);
}
}
6、
静态方法什么是静态方法呢?就是直接添加在某个对象上的属性或者方法,它仅对一个对象有效,例如:
nahao.skill
= '会点XHTML,CSS,现在还会说JavaScript了';添加完这个语句之后,nahao就拥有了skill属性。但是出自同一个构造函数的gaoshou和wudi却不受任何影响。当然了,我们可以给它们也加上这个属性:
gaoshou.skill
= '精通HTML,CSS,JS,FLEX,PHP,.NET,Linux编程,Perl,Ruby,XXX...';
wudi.skill
= '能用啤酒瓶盖与沙子手工打磨出CPU等PC基本零部件。';
同样,我们也可以给构造函数添加静态方法,但是这同样不会影响使用该构造函数定义的对象。例如:
Person.showName
= function(){
alert(this.name);
};
Person.showName();
nahao.showName();//我们给Person定义了一个showName函数,但是它只对构造函数Person本身有用(但是没有什么实际意义),如果在nahao对象上调用这个方法将会出错。
7、
给对象定义私有成员公开的对象?在前面定义的所有对象,其所有的属性都是暴露在外的,可以随便访问,甚至修改也没问题。例如我们可以通过nahao.name直接访问到对象的名字等等属性。如果我们希望有一个属性对外保密,就可以给对象定义私有属性:
function
Person(nameArg,genderArg,yearOfBirthArg,siteArg,privacyArg){
……
var privacy
= privacyArg;
……
}
var
nahao = new
Person('Top css',male,1989,'www.javava.org','有10跟脚趾头');
alert(nahao.privacy); //对构造函数作出一定修改之后,我们给nahao对象添加了一个privacy属性,如果试图alert它的值的话将会显示undefined。
下面再来看看私有方法,如果我们对Person构造函数作出如下修改:
function
Person(nameArg,genderArg,yearOfBirthArg,siteArg,privacyArg){
function insideOnly(){
alert('我只在对象内部可以调用!');
}
}//那么insideOnly将不能被外部所访问,如果试图执行这个函数将会出错。需要注意的是,私有方法并没有绑定到对象上,它的this关键字也并不指向对象。如果需要在私有方法内引用对象,那么可以使用如下方法:
function
Person(nameArg,genderArg,yearOfBirthArg,siteArg,privacyArg){
……
var myOwner =
this;
function insideOnly(){
alert(myOwner.name);
}
}//首先在构造函数中定义一个myOwner变量,将this关键字赋给它,之后就可以在私有函数里使用这个变量来访问对象本身了。
8、
特权方法私有成员不能在对象的外部访问,不能访问的对象有什么用?我们可以使用特权方法来访问这些私有属性。所谓特权方法就是使用this关键字定义的函数,例如:
function
Person(nameArg,genderArg,yearOfBirthArg,siteArg,privacyArg){
……
this.showPrivacy =
function(){
var str =
'秘密:' + this.name
+ privacy + '!';
alert(str);
};
}
var
nahao = new
Person('Top css',male,1989,'www.javava.org','有10跟脚趾头');
nahao.showPrivacy();
我们首先给Person构造函数添加了一个showPrivacy特权方法,方法中使用了私有变量privacy的值。最后我们在nahao对象上调用该方法,结果如下:
9、
prototype浅析首先,我们要否定上面这句话“对Person.prototype的修改同样会影响到使用Person定义的对象。”请看如下代码:
Person.prototype
= {
mark:'Person.Proto'
}
var
nahao = new
Person('Top css',male,1989,'www.javava.org');
Person.prototype
= {
mark:'Person.NewProto'
}
alert(nahao.mark);
alert的输出会是什么呢?根据上面的经验,在alert之前,对Person.prototype的最后修改将它的mark属性赋值为'Person.NewProto'。但是实际的输出结果:Person.Proto
这不是bug,而且各个浏览器里都一样。原因分析如下:
Person.prototype
= {
mark:'Person.Proto'
}
一段首先创建一个对象字面量,并且赋值给Person.prototype,我们称这个对象字面量为Proto。
var
nahao = new
Person('Top css',male,1989,'www.javava.org');
在创建nahao对象并且按照构造函数初始化对象的同时,会悄悄给nahao对象设置一个内部属性,我们暂且将其命名为xxx,并且将其赋值为Person.prototype的值,也就是上面提到的对象字面量Proto,JavaScript的动态继承也就是由这个xxx实现的。(这个JavaScript的内部实现机制不是我拍脑门想出来的,是Netscape的工作人员的一篇文章里提到的,下面也会用程序来证明这个流程。)然后,
Person.prototype
= {
mark:'Person.NewProto'
}
这里我们将创建另外一个对象字面量NewProto,并且赋值给Person.prototype。到这里就很明显了,尽管我们修改了
Person.prototype,但是并没有影响到nahao对象。当我们访问nahao.mark的时候,它首先在自己内部找,找不到就会去找xxx,自然就找到了Proto,而非NewProto。那么xxx这个实现动态继承的关键究竟是什么呢?在FireFox中它是__proto__,有以下代码为证。至于在IE中xxx是什么我还没找到。
Person.prototype
= {
mark:'Person.Proto'
}
var
nahao = new
Person('Topcss','male',1989,'www.nahao8.com');
nahao.prototype
= {
mark:'Person.NewProto'
}
alert(nahao.mark);
alert(nahao.__proto__.mark);//两次alert的结果都是一样的,都是Proto。
alert(nahao.__proto__===Person.prototype);//结构为true。
以上代码经过测试适用于FireFox和chrome。NetScape应该也可以,IE不行。
个人观点:Person.prototype =
{}的方式最好只在定义构造函数的时候使用一次,而且要紧跟着构造函数写,以后修改prototype的时候都使用Person.prototype.protertyA =
‘valueA’的形式。
10、
最后的构造函数我们在上面看到了定义对象,以及设这和修改其属性的各种方法,我们可以在构造函数中定义属性,可以在对象外部定义(静态)属性,也可以在对象的prototype中定义属性。下面是我使用的大致格式:
function
Person(nameArg,genderArg,yearOfBirthArg,siteArg,privacyArg){
//公有属性
this.name
= nameArg;
this.gender
= genderArg;
this.yearOfBirth =
yearOfBirthArg;
this.site
= siteArg;
//私有属性
var privacy
= privacyArg;
//特权方法
this.showPrivacy =
function(){
};
}
Person.prototype
= {
//公有方法
info : function(){
},
func:function(){
}
}
分享到:
相关推荐
### JavaScript面向对象进阶知识点详解 #### 8.1 面向对象编程的基本特性 在探讨面向对象的JavaScript之前,我们首先需要了解面向对象编程(Object-Oriented Programming, OOP)的基本特性:封装性、抽象性、继承...
面向对象编程是现代JavaScript的核心之一,它通过构造函数、原型链等机制实现了类和继承的概念。掌握这些基本概念对于构建高效、可维护的JavaScript应用至关重要。同时,合理利用现有的测试工具和框架可以极大地提高...
面向对象编程(Object-Oriented Programming,OOP)是JavaScript中的一个重要概念,它允许开发者以更加模块化、可复用的方式组织代码。下面将详细探讨JavaScript面向对象编程的基本原理、特性以及实际应用。 1. **...
JavaScript,作为一种广泛应用于Web开发的动态脚本语言,最初被设计为简单的客户端脚本语言,但随着技术的发展,它已经发展出了丰富的面向对象编程(OOP)特性。面向对象JavaScript开发是现代Web开发中不可或缺的一...
### JavaScript面向对象编程详解 #### 引言 在软件工程领域,面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。每个对象都可以包含数据(属性)和方法(行为)。JavaScript虽然起初并非为面向对象...
随着现代Web应用程序变得越来越复杂,对JavaScript编程的要求也越来越高,特别是面向对象的编程技术。面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。对象可以包含数据,以字段(通常称为属性或成员...
面向对象编程(Object-Oriented Programming,OOP)是JavaScript中的一种重要编程范式,它允许开发者创建复杂的、可复用的代码结构。在本“JavaScript面向对象编程”主题中,我们将深入探讨这一概念及其在JavaScript...
JavaScript是一种广泛用于Web开发的动态编程语言,虽然它在语法层面并未像Java或C++那样直接支持类(class)等传统面向对象概念,但它仍然具备面向对象的特性,如封装、继承和多态。面向对象编程(OOP)的核心是通过...
JavaScript是一种广泛应用于Web开发的动态、弱类型、基于原型的脚本语言,它不仅支持函数式编程,还具有强大的面向对象编程能力。面向对象编程(Object-Oriented Programming,简称OOP)是JavaScript中的一项核心...
### JavaScript面向对象之对象的深入理解 #### 一、引言 在JavaScript中,对象是其核心组成部分之一,几乎所有的操作都是围绕着对象来进行的。本文将深入探讨JavaScript中的对象概念,通过具体示例帮助读者更好地...
虽然它最初设计时并非完全的面向对象语言,但JavaScript确实支持面向对象的编程范式,使得开发者能够创建复杂的数据结构和复用代码。 在JavaScript中,面向对象主要依赖于以下几个关键概念: 1. **对象**:...
### JavaScript学习深入—面向对象编程 #### 一、JavaScript中的类型概述 JavaScript作为一种动态的、弱类型的语言,其核心特点之一在于它灵活的对象模型。尽管JavaScript的基础架构支持面向对象编程(OOP),但在...
JavaScript面向对象技术在实现树形控件中扮演着至关重要的角色。树形控件是一种用于展示层次型数据的用户界面元素,它具有扩展和折叠功能,可以在有限的空间内清晰地展示大量的信息,使得数据间的层级关系一目了然。...
JavaScript是一种强大的脚本语言,它的面向对象编程机制与C++和Java等静态类型语言有所不同,但同样具有灵活性和表达力。在JavaScript中,面向对象主要依赖于对象、函数以及原型链来实现。以下是对JavaScript面向...
《JavaScript内核系列》和《JavaScript面向对象基础》这两本书籍是深入理解JavaScript语言核心机制和面向对象编程的重要参考资料。JavaScript作为一种广泛应用于Web开发的脚本语言,其内核和面向对象特性对于开发者...
JavaScript 面向对象技术是编程中的核心概念,尤其在Web开发中占据着举足轻重的地位。面向对象编程(Object-Oriented Programming,OOP)允许开发者通过模拟现实世界中的对象来创建复杂的软件系统。JavaScript,作为...
面向对象编程(Object-Oriented Programming, OOP)是JavaScript中的核心编程范式之一,它通过类和对象来组织代码,使得程序更加模块化、可维护。在这个名为"小游戏JavaScript面向对象编程贪吃蛇"的项目中,我们将...