`
pouyang
  • 浏览: 321681 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaEye javascript面向对象技术基础(五)

阅读更多
转自:http://www.iteye.com/wiki/Object_Oriented_JavaScript/1283-javascript-object-oriented-technology-five
类变量/类方法/实例变量/实例方法
先补充一下以前写过的方法:
在javascript中,所有的方法都有一个call方法和apply方法.这两个方法可以模拟对象调用方法.它的第一个参数是对象,后面的
参数表示对象调用这个方法时的参数(ECMAScript specifies two methods that are defined for all functions, call()
and apply(). These methods allow you to invoke a function as if it were a method of some other object. The first
argument to both call() and apply() is the object on which the function is to be invoked; this argument becomes
the value of the this keyword within the body of the function. Any remaining arguments to call() are the values
that are passed to the function that is invoked).比如我们定义了一个方法f(),然后调用下面的语句:
f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m;
举个例子:

function Person(name,age) {  //定义方法   
    this.name = name;   
    this.age = age;   
}   
var o = new Object();   //空对象   
alert(o.name + "_" + o.age); //undefined_undefined   
  
Person.call(o,"sdcyst",18); //相当于调用:o.Person("sdcyst",18)   
alert(o.name + "_" + o.age); //sdcyst_18   
  
Person.apply(o,["name",89]);//apply方法作用同call,不同之处在于传递参数的形式是用数组来传递   
alert(o.name + "_" + o.age); //name_89  

实例变量和实例方法都是通过实例对象加"."操作符然后跟上属性名或方法名来访问的,但是我们也可以为类来设置方法或变量,
这样就可以直接用类名加"."操作符然后跟上属性名或方法名来访问.定义类属性和类方法很简单:
Person.counter = 0;   //定义类变量,创建的Person实例的个数   
function Person(name,age) {   
    this.name = name;   
    this.age = age;   
    Person.counter++; //没创建一个实例,类变量counter加1   
};   
  
Person.whoIsOlder = function(p1,p2) { //类方法,判断谁的年龄较大   
    if(p1.age > p2.age) {   
        return p1;   
    } else {   
        return p2;   
    }   
}   
  
var p1 = new Person("p1",18);   
var p2 = new Person("p2",22);   
  
alert("现在有 " + Person.counter + "个人");  //现在有2个人   
var p = Person.whoIsOlder(p1,p2);   
alert(p.name + "的年龄较大");   //p2的年龄较大  

prototype属性的应用:
下面这个例子是根据原书改过来的.
假设我们定义了一个Circle类,有一个radius属性和area方法,实现如下:

function Circle(radius) {   
    this.radius = radius;   
    this.area = function() {   
        return 3.14 * this.radius * this.radius;   
    }   
}   
var c = new Circle(1);   
alert(c.area());  //3.14 

假设我们定义了100个Circle类的实例对象,那么每个实例对象都有一个radius属性和area方法,
实际上,除了radius属性,每个Circle类的实例对象的area方法都是一样,这样的话,我们就可以
把area方法抽出来定义在Circle类的prototype属性中,这样所有的实例对象就可以调用这个方法,
从而节省空间.
function Circle(radius) {   
    this.radius = radius;   
}   
Circle.prototype.area = function() {   
        return 3.14 * this.radius * this.radius;   
    }   
var c = new Circle(1);   
alert(c.area());  //3.14  

现在,让我们用prototype属性来模拟一下类的继承:首先定义一个Circle类作为父类,然后定义子类
PositionCircle.
function Circle(radius) {  //定义父类Circle   
    this.radius = radius;   
}   
Circle.prototype.area = function() { //定义父类的方法area计算面积   
    return this.radius * this.radius * 3.14;   
}   
  
function PositionCircle(x,y,radius) { //定义类PositionCircle   
    this.x = x;                    //属性横坐标   
    this.y = y;                    //属性纵坐标   
    Circle.call(this,radius);      //调用父类的方法,相当于调用this.Circle(radius),设置PositionCircle类的   
                                   //radius属性   
}   
PositionCircle.prototype = new Circle(); //设置PositionCircle的父类为Circle类   
  
var pc = new PositionCircle(1,2,1);   
alert(pc.area());  //3.14   
                   //PositionCircle类的area方法继承自Circle类,而Circle类的   
                   //area方法又继承自它的prototype属性对应的prototype对象   
alert(pc.radius); //1  PositionCircle类的radius属性继承自Circle类   
  
/*  
注意:在前面我们设置PositionCircle类的prototype属性指向了一个Circle对象,  
因此pc的prototype属性继承了Circle对象的prototype属性,而Circle对象的constructor属  
性(即Circle对象对应的prototype对象的constructor属性)是指向Circle的,所以此处弹出  
的是Circ.  
*/  
alert(pc.constructor); //Circle       
  
/*为此,我们在设计好了类的继承关系后,还要设置子类的constructor属性,否则它会指向父类  
的constructor属性  
*/  
PositionCircle.prototype.constructor = PositionCircle   
alert(pc.constructor);  //PositionCircle  
分享到:
评论

相关推荐

    JavaEye+技术架构

    JavaEye+技术架构,讲述java框架的应用

    JavaEye博文JavaEye博文JavaEye博文

    2. 面向对象设计的11原则:本节讨论了面向对象设计的11个原则,包括单一职责原则、开放封闭原则、Liskov替换原则等。 3. 测试驱动开发:本节讨论了测试驱动开发的概念和应用,包括使用Python编写xUnit例子的方法。 ...

    JavaScript深入编程网页收集

    _filesjavascript如何避免内存泄露 - - JavaEye技术网站_filesprototype_js深入研究_files从 prototype_js 深入学习 javascript 的面向对象特性 - - AJAX - JavaEye论坛_files带参数的闭包函数的巧妙应用 - ...

    javaeye Robbin 论缓存技术

    在Javaeye Robbin的讨论中,他提到了缓存技术在多种场景下的应用和重要性。 **缓存的作用** 1. **高速缓冲存储**:缓存是一种位于主存储器和慢速I/O设备之间的高速存储器,其目的是减少对慢速设备的访问次数,提高...

    javaeye被黑

    javaeye被黑 大家看看

    JavaScript使用prototype定义对象类型

    From: JavaEye.com prototype提供了一套JavaScript面向对象基础设施,我们可以使用它来进行面向对象编程,定义对象类型方式如下: var Person = Class.create(); Person.prototype = { initialize : ...

    JavaEye新闻月刊_-_2009年3月_-_总第13期

    在JavaScript和Ajax技术方面,新闻月刊详细介绍了当时流行的70个新鲜实用技术和40个轻量级JavaScript库,以及100个高质量的XHTML/CSS模板。这些技术资源为前端开发者提供了丰富的选择,有助于提升网页设计和用户体验...

    javaeye热点阅读

    20. AJAX技术:包括ExtJS基础教程和jQuery图片循环效果,展示了AJAX如何提升用户体验。 此外,文件还涉及到了软件开发和项目管理的话题,如面子驱动编程、创业公司项目管理的挑战等,这些都是开发者职业生涯中不容...

    javaeye代码高亮插件

    JavaEye是一款知名的面向开发者的技术社区,它提供了丰富的代码展示功能,其中包括代码高亮显示。在WordPress等博客平台中,为了使代码段在文章中清晰易读,通常会使用代码高亮插件。JavaEye的代码高亮插件以其简洁...

    JavaScript使用prototype定义对象类型(转)[

    From: JavaEye.comprototype提供了一套JavaScript面向对象基础设施,我们可以使用它来进行面向对象编程,定义对象类型方式如下: var Person = Class.create();Person.prototype = { initialize : function(name, ...

    javaeye的信息提示框代码之js

    javaeye的信息提示框代码之css,application.js

    JavaEye3.0开发手记

    ### JavaEye3.0开发手记之开发环境搭建详解 #### 一、开发环境搭建概述 随着JavaEye3.0开发计划的启动,本篇文章将详细介绍如何为该项目搭建高效的开发环境。开发过程中不仅需要考虑软件的选择,还需要针对操作...

    JavaEye Client SourceCode

    源码中会包含Java的基本语法、面向对象编程概念,如类、接口、继承、多态等,以及异常处理和集合框架的使用。 4. **Android UI设计**:Android应用的用户界面主要通过XML布局文件定义。JavaEye客户端可能使用了各种...

    javaeye月刊2008年4月 总第2期.pdf

    【JavaEye月刊2008年4月总第2期】主要涵盖了多个与Java相关的技术和行业动态。以下是对这些内容的详细解析: 1. **Spring创始人Rod Johnson再次发飙—“传统Java应用服务器正在没落”** Rod Johnson是Spring框架的...

    javaEye客户端

    JavaEye客户端是一款基于Java开发的开源软件,专为学习和理解客户端编程技术而设计,尤其适合初学者。这个客户端代码库包含了许多与网络通信相关的功能,主要集中在HTTP协议的使用和数据解析上。通过深入研究JavaEye...

    javaeye论坛小测试答案

    javaeye 论坛小测试 javaeye论坛小测试答案 javaeye论坛测试答案 这下你们就省事了。

Global site tag (gtag.js) - Google Analytics