网络编程
位置:首页>> 网络编程>> JavaScript>> javascript面向对象技术基础(四)(2)

javascript面向对象技术基础(四)(2)

作者:sdcyst 来源:javaeye 发布时间:2010-02-07 13:15:00 

标签:JavaScript,面向对象,函数

看个具体的例子吧:

function Person(name,sex) {  //构造函数    this.name = name;    this.sex = sex; } Person.prototype.age = 12;   //为prototype属性对应的prototype对象的属性赋值 Person.prototype.print = function() { //添加方法    alert(this.name+"_"+this.sex+"_"+this.age); }; var p1 = new Person("name1","male"); var p2 = new Person("name2","male"); p1.print();  //name1_male_12 p2.print();  //name2_male_12 Person.prototype.age = 18;  //改变prototype对象的属性值,注意是操作构造函数的prototype属性 p1.print();  //name1_male_18 p2.print();  //name2_male_18

 

到目前为止,我们已经模拟出了简单的类的实现,我们有了构造函数,有了类属性,有了类方法,可以创建"实例".

在下面的文章中,我们就用"类"这个名字来代替构造方法,但是,这仅仅是模拟,并不是真正的面向对象的"类".

在下一步的介绍之前,我们先来看看改变对象的prototype属性和设置prototype属性的注意事项:

给出一种不是很恰当的解释,或许有助于我们理解:当我们new了一个对象之后,这个对象就会获得构造函数的prototype属性(包括函数和变量),可以认为是构造函数(类)继承了它的prototype属性对应的prototype对象的函数和变量,也就是说,prototype对象模拟了一个超类的效果.听着比较拗口,我们直接看个实例吧:

function Person(name,sex) {  //Person类的构造函数    this.name = name;    this.sex = sex; } Person.prototype.age = 12;   //为Person类的prototype属性对应的prototype对象的属性赋值,                             //相当于为Person类的父类添加属性 Person.prototype.print = function() { //为Person类的父类添加方法    alert(this.name+"_"+this.sex+"_"+this.age); }; var p1 = new Person("name1","male"); //p1的age属性继承子Person类的父类(即prototype对象) var p2 = new Person("name2","male"); p1.print();  //name1_male_12 p2.print();  //name2_male_12 p1.age = 34; //改变p1实例的age属性 p1.print();  //name1_male_34 p2.print();  //name2_male_12 Person.prototype.age = 22;  //改变Person类的超类的age属性 p1.print();  //name1_male_34(p1的age属性并没有随着prototype属性的改变而改变) p2.print();  //name2_male_22(p2的age属性发生了改变) p1.print = function() {  //改变p1对象的print方法    alert("i am p1"); } p1.print();  //i am p1(p1的方法发生了改变) p2.print();  //name2_male_22(p2的方法并没有改变) Person.prototype.print = function() { //改变Person超类的print方法    alert("new print method!"); } p1.print();  //i am p1(p1的print方法仍旧是自己的方法) p2.print();  //new print method!(p2的print方法随着超类方法的改变而改变)

 

看过一篇文章介绍说javascript中对象的prototype属性相当于java中的static变量,可以被这个类下的所有对象共用.而上面的例子似乎表明实际情况并不是这样:

在JS中,当我们用new操作符创建了一个类的实例对象后,它的方法和属性确实继承了类的prototype属性,类的prototype属性中定义的方法和属性,确实可以被这些实例对象直接引用.但是,当我们对这些实例对象的属性和方法重新赋值或定义后,那么实例对象的属性或方法就不再指向类的prototype属性中定义的属性和方法,此时,即使再对类的prototype属性中相应的方法或属性做修改,也不会反应在实例对象身上.这就解释了上面的例子:

一开始,用new操作符生成了两个对象p1,p2,他们的age属性和print方法都来自(继承于)Person类的prototype属性.然后,我们修改了p1的age属性,后面对Person类的prototype属性中的age重新赋值(Person.prototype.age = 22),p1的age属性并不会随之改变,但是p2的age属性却随之发生了变化,因为p2的age属性还是引自Person类的prototype属性.同样的情况在后面的
print方法中也体现了出来.

通过上面的介绍,我们知道prototype属性在javascript中模拟了父类(超类)的角色,在js中体现面向对象的思想,prototype属性是非常关键的.

0
投稿

猜你喜欢

  • 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHO
  • 如何最大限度地实现安全登录功能?    具体方法如下(这是一个程序,为便于说明,中间用虚线“------”将代
  • 最近网上再度兴起了CSS布局和Table 布局的争论。我最初颇有些不以为然:我原以为CSS 布局的意义早已深入人心,却没想到还有这么多设计师
  • 网页设计中的脏、乱、差,是我们在设计过程中常会遇到的问题。通常"脏"是由对色彩使用不当所产生的,而色彩使用不当产生的不好
  • 桥接模式Bridge Pattern是什么桥接模式是一种结构型模式,它将抽象部分与实现部分分离开来,使它们可以独立地变化。在桥接模式中,我们
  • 版本 0.9来自 http://onewww.net说明:当焦点不在表格内的input时,回车键复制最后一行,delete删除键最后一行选择
  • 由 John Resig 的 How JavaScript Timers Work 可以知道,现有的 JavaScript 引擎是单线程处理
  • 如果你用SQL Server 2005 Management Studio建立函数或存储过程,你会注意到这些新窗口中都是模板。通常,你可以获
  • 实例 1基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径。/AAA选择根
  •     我们可以利用 Cookie collection 来刪除客户端的Cookies: <%
  • 现在大部分网站都使用asp+access构建,这样的话通过下载access数据库简单就可以对网站进行破坏!  而很多的网站都不太重
  • Oracle物理结构故障是指构成数据库的各个物理文件损坏而导致的各种数据库故障。这些故障可能是由于硬件故障造成的,也可能是人为误操作而引起。
  • WEB程序员的技能要求: Web程序员不光要对 后端程序(如 php,jsp,asp.net)语言知识,对程序设计架构知识,数据库
  • 1、查看数据库中有哪些用户? select username from all_users;2、查看数据库中有哪些DBA用户? select
  • 1、DOMWEB标准现在可真是热门中热门,不过下面讨论的是一个不符合标准的document.all[]。DOM--DOCUMENTOBJEC
  • 继续我们的 Javascript 优化计划,上期已经做到怎么尽可能的缩小 Javascript 脚本的文件体积便于传输。不过这样做仅仅是不够
  • 计是一个输入-输出的过程,因为首先有用户的需求,客户的项目才有设计的产生,设计是带有目的性和市场行为的,当然也有一部分的创造性设计,仅仅为了
  • 一个拖动层和Onmouse自动下拉效果,IE支持,不支持ff。下面所示的效果四个小块可以拖动到页面任意点,大黑块可以连同四个小块随动。<
  •  <%''调用例子'Dim int_RPP,int_Start,int_showNumberLink
  • 谢谢icedblog提供的代码, 从那个js中我参考了moveSelect的利用, 不过那个代码中有几个BUG, 比如按住鼠标不放会不见显示
手机版 网络编程 asp之家 www.aspxhome.com