`
sdcyst
  • 浏览: 58078 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

类变量/类方法/实例变量/实例方法
先补充一下以前写过的方法:
在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
 
分享到:
评论
28 楼 123003473 2011-10-24  
function Parent(name){
    this.name = name;

}
Parent.prototype.say = function(){
    alert('我的名字:'+this.name);
}

Parent.prototype.sayGrade= function(){
    alert('我已经不上学了');
}

function Student(grade,name){
    this.grade = grade;
    Parent.call(this,name);
}

Student.prototype = new Parent();
Student.prototype.constructor = Student;
Student.prototype.super=Parent.prototype;
Student.prototype.sayGrade = function(){
    this.super.sayGrade();
    alert('我上'+this.grade);
}

var stu1 =new Student('1','胡');
stu1.say();
stu1.sayGrade();
stu1.hasOwnProperty('name');
27 楼 google_fans 2009-04-27  
还不错,值得一看啊
26 楼 Blithe 2009-02-20  
terrysunhh 写道


3. PositionCircle.prototype.constructor = PositionCircle;
   alert(PositionCircle.constructor);
   alert(PositionCircle.prototype.constructor)
   与  
  
   PositionCircle.prototype = new PositionCircle();// 参考PositionCircle.prototype = new Circle();
   alert(PositionCircle.constructor);
   alert(PositionCircle.prototype.constructor)

请问这有什么qubie
25 楼 terrysunhh 2009-02-12  
请教一下,在最后一段代码中
1. PositionCircle.prototype = new Circle();
new Circle()是创建一个新的Circle实例还是设置PositionCircle.prototype属性指向Circle函数

2. alert(PositionCircle.constructor);
   alert(PositionCircle.prototype.constructor)
为什么得到不一样的结果呢?PositionCircle.constructor与PositionCircle.prototype.constructor有什么区别?

3. PositionCircle.prototype.constructor = PositionCircle;
   alert(PositionCircle.constructor);
   alert(PositionCircle.prototype.constructor)
   与  
  
   PositionCircle.prototype = new PositionCircle();// 参考PositionCircle.prototype = new Circle();
   alert(PositionCircle.constructor);
   alert(PositionCircle.prototype.constructor)
输出不一样?请教一下
24 楼 sdcyst 2008-12-30  
hanjs 写道
f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m; //这个是什么时候执行的?

我怎么通过代码看是这样的情况呢?

o=f(1,2);


f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m;
后面的情况是为了描述的更清楚而假设的

你自己假设的情况是不正确的,最好自己试一下。

23 楼 hanjs 2008-12-30  
f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m; //这个是什么时候执行的?

我怎么通过代码看是这样的情况呢?

o=f(1,2);

22 楼 sdcyst 2008-12-30  
liliefeng 写道

楼主的代码有很多错误,很明显的一个就是this的使用,其实this在js中是关联执行时的作用域,而非定义时的作用域,呵呵,好好看看,别误导新手

this的作用域是在js关联执行时确定的,但是在文章中我并没有提到这方面的内容。而且,如果代码有错误的话,那还请你详细的指出来,我肯定非常感谢
21 楼 liliefeng 2008-12-29  
楼主的代码有很多错误,很明显的一个就是this的使用,其实this在js中是关联执行时的作用域,而非定义时的作用域,呵呵,好好看看,别误导新手
20 楼 hite 2008-12-26  
daoyongyu 写道
謝謝樓主,辛苦了.寫的很好,淺顯易懂!!

这个系列基本看完了。
ps:贴主感觉繁体很帅吗?还是因为是港澳人士?小小的不爽而已。没事没事。
19 楼 yza0088 2008-12-24  
楼主第一次让我感觉到js的可怕 呵呵
18 楼 yingwuhahahaha 2008-12-19  
daoyongyu 写道
謝謝樓主,辛苦了.寫的很好,淺顯易懂!!

同感同感
17 楼 daoyongyu 2008-12-18  
謝謝樓主,辛苦了.寫的很好,淺顯易懂!!
16 楼 zhuxinyu 2008-12-17  
是否还有下文  期待 继续
15 楼 sdcyst 2008-12-16  
yuxiaojicai 写道

我很就不回复了 ,但看到你写的文章,不得不回复,写的真好,我学js,总共才有两次感悟,其中第二次是看了你的文章后,谢谢诶!

但愿我的文章不会给你造成误解,多看看别人的文章,比较一下。
14 楼 yuxiaojicai 2008-12-16  
我很就不回复了 ,但看到你写的文章,不得不回复,写的真好,我学js,总共才有两次感悟,其中第二次是看了你的文章后,谢谢诶!
13 楼 xinguangduan 2008-12-13  
很不错,适合js初学者,不知道有没有相关的书籍?
12 楼 guazi 2008-12-10  
受教了...感谢二位...
11 楼 yunhaifeiwu 2008-12-09  
是的,楼主。
10 楼 sdcyst 2008-12-09  
yunhaifeiwu 写道


你说的
引用f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m;

揭示f.call的含义,这是从等价代码的角度上揭示的。如果用文字进行描述又是怎样的呢?
msdn上的描述很准确,很严密,但是理解有点困难。
因此我站到我测试得到的结果,进行总结归纳: 
  f.call(o,1,2)的含义是:
  1 调用了函数f .其实际参数是 1,2
  2 在f函数执行时也仅在f函数执行时,f中的this参数中具有o中的属性。如果原来有与o相同的属性,
则会被覆盖掉。

申明:以上仅仅是个人对call的自我总结,目的是辅助理解,准确的定义请看相关权威教材。三人行必有

我师,如果有误,请指出,我会及时更正。在技术论坛上,谢绝因观点不一样,而进行人身攻击。



http://msdn.microsoft.com/zh-cn/magazine/cc163419.aspx
下面这句话是从上面提到的文章中摘录出来的:
JavaScript 中的函数是对象.每个函数对象都有一个名为 call 的方法,它将函数作为第一个参数的方法进行调用。就是说,作为函数第一个参数传递给 call 的任何对象都将在函数调用中成为“this”的值.

可能是因为javascript是一种弱类型的语言,没有那么严格的要求,所以才导致我们对问题的理解不同.当时写这些东西的时候我也没有用调试工具来调试,所以没有想到你提到的那一点.上面的文章也是从msdn上找的,不知道是不是你说的那一篇.大家参考一下,具体怎么理解就看个人了.
9 楼 yunhaifeiwu 2008-12-09  
sdcyst 写道
yunhaifeiwu 写道


测试了,你的这种也是正确的。从中受教了。感谢中!



f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m;

上面这个例子是原文中的,后来我测试的时候也是这样.你可以找到原书看一下.
我非常害怕自己的帖子会对别人产生误导,所以非常感谢你的意见.

扣个字眼:你在回复中说,"你的这种测试也是正确的",但是我还是没弄明白你原来
想要表达的意思,包括你觉得那个例子.


你说的
引用
f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m;


揭示f.call的含义,这是从等价代码的角度上揭示的。如果用文字进行描述又是怎样的呢?
msdn上的描述很准确,很严密,但是理解有点困难。
因此我站到我测试得到的结果,进行总结归纳: 
  f.call(o,1,2)的含义是:
  1 调用了函数f .其实际参数是 1,2
  2 在f函数执行时也仅在f函数执行时,f中的this参数中具有o中的属性。如果原来有与o相同的属性,
则会被覆盖掉。

申明:以上仅仅是个人对call的自我总结,目的是辅助理解,准确的定义请看相关权威教材。三人行必有

我师,如果有误,请指出,我会及时更正。在技术论坛上,谢绝因观点不一样,而进行人身攻击。




相关推荐

    javascript面向对象技术基础

    javascript面向对象技术基础,javascript面向对象技术基础

    javascript面向对象技术基础 整理排版了一下

    javascript面向对象技术基础 整理排版了一下 外带了个闭包的文章,下了可以直接打印了

    js面向对象技术基础

    一个很好的学习javascript的资料,详细叙述了javascript面向对象的原理,并含有大量的程序例子说明。非常实用。

    javascript 面向对象技术基础教程第1/2页

    看了很多介绍javascript面向对象技术的文章,很晕.为什么?不是因为写得不好,而是因为太深奥.

    [推荐]javascript 面向对象技术基础教程

    看了很多介绍javascript面向对象技术的文章,很晕.为什么?不是因为写得不好,而是因为太深奥.javascript中的对象还没解释清楚怎么回事,一上来就直奔主题,类/继承/原型/私有变量....

    javascript面向对象教程

    本教程针对那些对javascript语言有一定的了解,从事过web开发,并且在实际中或多或少地使用过javascript的开发和技术人员 javascript语言基础的语法在此就直接略过,不做介绍 通过本教程的学习,学习者应该了解...

    第5章 JavaScript编程技术 课件

    5.1 JavaScript编程基础 5.1.1 JavaScript简介 5.1.2 Javascript的使用方法 5.1.3 语法规则 5.1.4 运算符和表达式 5.1.5 函数 5.1.6流程控制 5.1.7 事件处理 5.2 JavaScript对象编程 5.2.1 Object 类型 5.2.2 Array...

    JavaScript征途

    JavaScript对象,数组,字符串,使用正则表达式操纵字符串,客户端,控制文档结构的模型,JavaScript事件驱动模型,CSS,Cookie,XML和JSON,Ajax,深入JavaScript面向对象编程,深入JavaScript函数式编程,深入...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    本书是一部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言...

    《JavaScript征途》书稿实例

    数组,字符串,使用正则表达式操纵字符串,客户端,控制文档结构的模型,JavaScript事件驱动模型,CSS,Cookie,XML和JSON,Ajax,深入JavaScript面向对象编程,深入JavaScript函数式编程,深入JavaScript动态化编程...

    javascrip上百技术总集

    -(4) JavaScript面向对象的支持--(5) JavaScript面向对象的支持--(6) JavaScript精简学习1:基础知识 JavaScript精简学习2:浏览器输出 JavaScript精简学习3:图像 JavaScript精简学习4:表单 ...

    javascript DOM 编程艺术

    从颇具深度的JavaScript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)、文档对象模型(DOM)到基于事件的Web脚本设计,从XML(E4X)到Ajax及JSON,从...

    JavaScript核心概念及实践 高清PDF扫描版 (邱俊涛).pdf

    《JavaScript核心概念及实践》不仅帮助读者迅速掌握JavaScript基础知识和核心技术,而且通过实例讲解如何将这些知识和技术理解应用到实际工作中,提升编程能力,以简洁、优美的代码开发出功能强大且更易于维护和扩展...

    征服RIA:基于JavaScript的Web客户端开发卷二

    JavaScript高级篇:揭示JavaScript的运行机理和高级应用,如面向对象编程、函数式编程和元编程。Ajax篇:Ajax是上帝赐予JavaScript的礼物。凭借着Ajax,JavaScript拥有了异步调度服务端业务逻辑的能力。本篇除介绍...

    征服RIA:基于JavaScript的Web客户端开发卷三

    JavaScript高级篇:揭示JavaScript的运行机理和高级应用,如面向对象编程、函数式编程和元编程。Ajax篇:Ajax是上帝赐予JavaScript的礼物。凭借着Ajax,JavaScript拥有了异步调度服务端业务逻辑的能力。本篇除介绍...

    Javascript 高级编程第2版PDF part1

    从颇具深度的javascript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(bom)、文档对象模型(dom)到基于事件的web脚本设计,从xml(fax)到ajax及json,从...

Global site tag (gtag.js) - Google Analytics