文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎样理解javascript面向对象技术基础

2024-04-02 19:55

关注

怎样理解javascript面向对象技术基础,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

类变量/类方法/实例变量/实例方法

先补充一下以前写过的方法:

在javascript中,所有的方法都有一个call方法和apply方法.这两个方法可以模拟对象调用方法.它的***个参数是对象,后面的
参数表示对象调用这个方法时的参数.比如我们定义了一个方法f(),然后调用下面的语句:

f.call(o, 1, 2);

作用就相当于

o.m = f;  o.m(1,2);  delete o.m;

举个例子:

Js代码:

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

实例变量和实例方法都是通过实例对象加"."操作符然后跟上属性名或方法名来访问的,但是我们也可以为类来设置方法或变量,
这样就可以直接用类名加"."操作符然后跟上属性名或方法名来访问.定义类属性和类方法很简单:

Js代码

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方法,实现如下:

Js代码:

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属性中,这样所有的实例对象就可以调用这个方法,从而节省空间.

Js代码

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.

Js代码

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类      alert(pc.constructor); //Circle      PositionCircle.prototype.constructor = PositionCircle   alert(pc.constructor); //PositionCircle

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯