类变量/类方法/实例变量/实例方法
       在js中,所有的方法都有一个call方法和apply方法,这两个方法可以模拟对象调用方法。它的第一个参数是对象,后面的参数表示对象调用这个方法时的参数。比如,我们定义了一个方法f(),然后调用下面的语句:
       f.call(0,1,2);
       作用相当于:
       o.m = f;
       o.m(1,2);
       delete o.m;
       举个例子:
       JS代码:(见附件test1.html)
       //定义方法
       function Person(name,age){
              this.name = name;
              this.age = age;
       }
       //空对象
       var o = new Object();
       //undefined_undefined
       alert(o.name + "_" + o.age);
       //相当于调用o.person("wangsy",31);
       Person.call(o,"wangsy",31);
       //wangsy_31
       alert(o.name + "_" + o.age);
       //apply方法作用同call,不同之处在于传递参数的形式是用数组来传递
       Person.apply(o,["wangsy",31]);
       //wangsy_31
       alert(o.name + "_" + o.age);
       实例变量和实例方法都是通过实例对象加”.”操作符然后跟上属性名或方法来访问的,但是我们也可以为类来设置方法或变量。这样就可以直接用类名加”.”操作符然后跟上属性名或方法来访问。定义类属性和类方法很简单。
       JS代码:(见附件test2.html)
       //定义类变量,创建的Person实例的个数
       Person.counter = 0;
       //定义方法
       function Person(name,age){
              this.name = name;
              this.age = age;
              //每创建一个实例,类变量加1
              Person.counter++;
       }
       //类方法,判断谁的年龄较大
       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);
       //现在有2个人
       alert("现在有" + Person.counter + "个人");
       var p = Person.whoIsOlder(p1,p2);
       alert(p.name + "的年龄较大");
prototype属性的应用:
       假设定义了一个Circle类,有一个radisu属性和area方法,实现如下:
       JS代码:(见附件test3.html)
              function Circle(radius){
              this.radius = radius;
              this.area = function(){
                     return 3.14 * this.radius * this.radius;
              }
       }
       var c = new Circle(1);
       //3.14
       alert(c.area());
       假设我们定义了100个Circle类的实例对象,那么每个实例对象都有一个radius属性和area方法,实际上除了radius属性,每个Circle类的实例对象的area方法都是一样的,可以把area方法抽出来定义在Circle类的prototype属性中,这样所有的实例对象就可以调用这个方法,从而节省空间。
       JS代码:(见附件test4.html)
       function Circle(radius){
              this.radius = radius;
       }
       Circle.prototype.area = function(){
              return 3.14 * this.radius * this.radius;
       }
       var c = new Circle(1);
       //3.14
       alert(c.area());
       现在,我们用prototype属性来模拟一下类的继承:首先定义一个Circle类作为父类,然后定义了子类PositionCircle:
       JS代码:(见附件test5.html)
       //定义父类Circle
       function Circle(radius){
              this.radius = radius;
       }
       Circle.prototype.area = function(){
              //定义父类的方法area计算面积
              return 3.14 * this.radius * this.radius;
       }
       //定义PositionCircle类
       function PositionCircle(x,y,radius){
              //属性横坐标
              this.x = x;
              //属性纵坐标
              this.y = y;
              //调用父类的方法,相当于调用this.Circle(radius)
              //设置PositionCircle类的radius属性
              Circle.call(this,radius);
       }
       //设置PositionCircle的父类为Circle类
       PositionCircle.prototype = new Circle();
       var pc = new PositionCircle(1,2,1);
       //1
       alert(pc.radius);
       //Circle
       alert(pc.constructor);
       PositionCircle.prototype.constructor = PositionCircle;
       //PositionCircle
       alert(pc.constructor);

转载于:https://blog.51cto.com/jawsy/167226

javascript面向对象5相关推荐

  1. JavaScript面向对象编程

    自从有了Ajax这个概念,JavaScript作为Ajax的利器,其作用一路飙升.JavaScript最基本的使用,以及语法.浏览器对象等等东东在这里就不累赘了.把主要篇幅放在如何实现JavaScri ...

  2. 《JavaScript面向对象精要》读书笔记

    JavaScript(ES5)的面向对象精要 标签: JavaScript 面向对象 读书笔记 2016年1月16日-17日两天看完了<JavaScript面向对象精要>(参加异步社区的活 ...

  3. javascript面向对象系列第一篇——构造函数和原型对象

    前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如何用构造函数和原型对象来创建对象 构造函数 构造函数是 ...

  4. 用JSON和Javscript的prototype来构建完善的Javascript面向对象表示法

    [原文地址:http://www.cnblogs.com/robinhood/archive/2006/11/16/515412.html] 上次发贴没能很好的总结Javascrip编写类的方法,这次 ...

  5. 《JavaScript面向对象精要》——1.8 原始封装类型

    本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.8节,作者:[美]Nicholas C. Zakas 译者: 胡世杰 更多章节内容可以访问云栖社区" ...

  6. 《JavaScript面向对象编程指南》——第1章 引言1.1 回顾历史

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.1节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  7. 《JavaScript面向对象编程指南》——1.3 分析现状

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.3节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  8. JavaScript面向对象及原型 及setTimeout

    JavaScript面向对象 最笨的写法: function Foo(n) {     this.name = n;     this.sayName = function() {         c ...

  9. JavaScript面向对象的支持(7)

    ================================================================================ Qomolangma OpenProj ...

  10. (二)Javascript面向对象编程:构造函数的继承

    Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承&q ...

最新文章

  1. Composer使用
  2. jQuery 发送 AJAX 请求
  3. 函数mod(a,m)
  4. 【POI1999codevs3634】积水,关于sunshine爷的NOIP(suan)水(ge)题(pi)赛
  5. JAVA springboot ssm b2b2c多用户商城系统源码(三):服务提供与调用
  6. (2)数据结构-线性表顺序存储
  7. 【情感识别】基于matlab GUI改进的KNN算法语音情感分类识别【含Matlab源码 354期】
  8. IT十大风云人物(转水冰洋)
  9. 《史蒂夫乔布斯传》部分读书摘录
  10. 如何在微信H5页面链接跳转到第三方小程序的任意页面?
  11. Linux下打包压缩war和解压war包
  12. Allegro Layout常用功能
  13. 2021年【机械员】通用基础及岗位技能-考试题库及答案(三)
  14. MPC+HSM造就了安全的数字托管人
  15. 【Java基础学习】Java基础中容易忽略点-2
  16. 搭建本地Spring Initializr服务(2020/4/17)
  17. not find or load Qt Platform plugin “windows“ 报错
  18. HP 3PAR产品线
  19. 无线电台、无线网桥、网络结构相关知识总结
  20. 消除5个绩效管理流程的误区

热门文章

  1. php5.4源码下载,WordPress v5.4.2官方正式版源码下载
  2. android fragment中引入自定义view_厉害了,用Android自定义View实现八大行星绕太阳3D旋转效果...
  3. 生命银行怎么样_减脂就像是从“脂肪银行”中提款,想要成功,你要做到这两点...
  4. 网页自动关机代码HTML,win10系统打开邮件显示网页html源代码如何解决
  5. 1445.32php,nginx实现mysql的负载均衡
  6. 《软件项目管理(第二版)》第 8 章——项目团队与干系人 重点部分总结
  7. 堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系
  8. java jta 例子_Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)...
  9. uboot引导linux内核,u-boot启动内核的几种方式
  10. 哈哈机器人送到冰雪小镇_从小镇到上海:两代人的接力洄游 | 活动回顾