js面向对象编程详解

╰半夏微凉° 2022-05-29 06:42 293阅读 0赞

什么是面向对象编程(OOP)?

用对象的思想去写代码,就是面向对象编程

面向对象编程的特点

  1. 抽象:抓住核心问题(把一样的放在一起)
  2. 封装:只能通过对象来访问方法(避免乱用代码)
  3. 继承:从已有对象上继承出新的对象
  4. 多态:多对象的不同形态

对象的组成

  • 方法(行为、操作)——对象下面的函数叫做对象的方法
  • 属性——对象下面的变量叫做对象的属性

例:最简单的面向对象

  1. //var obj = {};
  2. var obj = new Object();//创建了一个空对象
  3. obj.name = '小明';//对象下面的变量是对象的属性
  4. obj.showName = function(){//对象下面的函数是对象的方法
  5. alert(obj.name);
  6. }
  7. obj.showName();

上面的代码就是一个完整的面向对象

工厂方式:

  • 面向对象中的封装函数

直接看例子

  1. function createPerson(name){
  2. //1.原料
  3. var obj = new Object();
  4. //2.加工
  5. obj.name = name;//属性
  6. obj.showName = function(){//方法
  7. alert( this.name );
  8. };
  9. //3.出厂
  10. return obj;//如果没有写这句代码,则返回值为undefined
  11. }
  12. var p1 = createPerson('小明');
  13. p1.showName();
  14. var p2 = createPerson('小强');
  15. p2.showName();

改成与系统对象类似的写法

  • 首字母大写
  • new关键字提取
  • this指向为新创建的对象

所以上面的代码改为

  1. function CreatePerson(name){
  2. this.name = name;
  3. this.showName = function(){
  4. alert( this.name );
  5. };//省略了 return this;因为这句代码是默认的
  6. }
  7. var p1 = new CreatePerson('小明');
  8. //p1.showName();
  9. var p2 = new CreatePerson('小强');
  10. //p2.showName();
  11. alert( p1.showName == p2.showName ); //false

这里我们需要知道一个概念:构造函数—用来创建对象的函数,叫做构造函数(new后面调用的函数叫做构造函数)

当new去调用一个函数,这个时候函数中的this就是创建出来的对象,而且函数的返回值直接就是this(隐式返回)

我们知道p1.showName和p2.showName其实都是

  1. function CreatePerson(name){
  2. this.name = name;
  3. this.showName = function(){
  4. alert( this.name );
  5. };//省略了 return this;因为这句代码是默认的
  6. }

那么为什么,下面的弹出结果却是false

  1. alert( p1.showName == p2.showName ); //false

这其实就涉及到了,对象的引用问题,因为虽然他们的值相同,但引用不同(也即内存地址不同),所以结果自然也是不同的。(如果你对对象的引用问题有疑问的话,请看js基本类型和引用类型的区别)

所以我们也就发现了这种方式存在的问题,所以我们引入了原型(prototype)的概念

原型的概念:

  • 重写对象的方法,让相同方法在内存中存在一份(去改写对象下面公用的方法或者属性,让公用的方法或者属性在内存中存在一份)

原型的优先级要低于普通方法。为了便于记忆,我们可以采用类比的方法

  • 原型可以看成css中的class,而普通方法可以看成css中的style

接下来我们通过原型改写工厂方式

原则:

  • 相同的属性和方法可以加在原型上
  • 混合的编程模式

    function CreatePerson(name){

    1. this.name = name;

    }
    CreatePerson.prototype.showName = function(){

    1. alert( this.name );

    }
    var p1 = new CreatePerson(‘小明’);
    var p2 = new CreatePerson(‘小强’);
    alert( p1.showName == p2.showName ); //true

总结面向对象的写法

  • 构造函数加属性,原型加方法

    function 构造函数(){
    this.属性
    }
    构造函数.原型.方法 = function(){};
    var 对象1 = new构造函数();
    对象.方法

下面举一个例子:面向对象之选项卡自动播放+点击按钮播放

原则:刚开始的时候先写出普通的写法,然后改成面向对象的写法

—普通方法的变形

  • 尽量不要出现函数嵌套函数
  • 可以有全局变量
  • 把onload中不是赋值的语句放到单独的函数中

—改成面向对象

  • 全局变量就是属性
  • 函数就是方法
  • onload中创建对象
  • 改this指向问题(注意:事件或者是定时器,尽量让面向对象中的this指向对象)

普通的写法此处就不再赘述,直接上面相对象的写法

HTML代码

  1. <div id="wrap1">
  2. <input type="button" class="active" value="按钮1"/>
  3. <input type="button" value="按钮2"/>
  4. <input type="button" value="按钮3"/>
  5. <div style="display:block">aaaaaa</div>
  6. <div>vvvvvvvvvvvvvv</div>
  7. <div>ddddddddddddddddddd</div>
  8. </div>
  9. <div id="wrap2">
  10. <input type="button" class="active" value="按钮1"/>
  11. <input type="button" value="按钮2"/>
  12. <input type="button" value="按钮3"/>
  13. <div style="display:block">aaaaaa</div>
  14. <div>vvvvvvvvvvvvvv</div>
  15. <div>ddddddddddddddddddd</div>
  16. </div>

CSS代码

  1. <style>
  2. #wrap1,#wrap2{width:400px; height:400px; margin:10px; padding:10px;}
  3. #wrap1 div,#wrap2 div{width:300px; height:300px; padding:10px; border:1px solid brown; display:none; margin:5px;}
  4. .active{background:red;}
  5. </style>

JS面向对象的代码

  1. <script>
  2. window.onload = function(){//window.onload中创建对象以及初始方法的调用
  3. var t1 = new Tab('wrap1');
  4. t1.init();
  5. var t2 = new Tab('wrap2');
  6. t2.init();
  7. t2.autoPlay();
  8. }
  9. function Tab(id){//构造函数里面获取到对象的属性
  10. this.oBox = document.getElementById(id);
  11. this.aBtn = this.oBox.getElementsByTagName('input');
  12. this.aDiv = this.oBox.getElementsByTagName('div');
  13. this.iNow = 0;
  14. }
  15. Tab.prototype.init = function(){//方法写在构造函数的原型下面
  16. var This = this;
  17. for(var i=0; i<this.aBtn.length; i++){
  18. this.aBtn[i].index = i;
  19. this.aBtn[i].onclick = function(){
  20. This.change(this);//事件调用函数时,注意要改this的指向问题
  21. }
  22. }
  23. }
  24. Tab.prototype.change = function(obj){
  25. this.iNow = obj.index;
  26. for(var i=0; i<this.aBtn.length; i++){
  27. this.aBtn[i].className = '';
  28. this.aDiv[i].style.display = 'none';
  29. }
  30. obj.className = 'active';
  31. this.aDiv[obj.index].style.display = 'block';
  32. }
  33. Tab.prototype.autoPlay = function(){
  34. var This = this;
  35. setInterval(function(){//定时器中的函数也要注意改this的指向问题
  36. This.iNow++;
  37. if(This.iNow==This.aBtn.length){
  38. This.iNow = 0;
  39. }
  40. for(var i=0; i<This.aBtn.length;i++){
  41. This.aBtn[i].className = '';
  42. This.aDiv[i].style.display = 'none';
  43. }
  44. This.aBtn[This.iNow].className='active';
  45. This.aDiv[This.iNow].style.display = 'block';
  46. },2000);
  47. }
  48. </script>

今天先总结这些,后续还会有面向对象其他知识的总结

发表评论

表情:
评论列表 (有 0 条评论,293人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JS面向对象编程

    让前端开发者最熟悉又最陌生的就是js的面向对象编程了吧,很多人对面向对象编程一脸茫然,并自嘲只会面向过程编程,面向测试编程,面向业务编程。其实面向对象在平时开发中无处不在,因为

    相关 js面向对象编程

    js中没有类的概念,但是却能够创建对象,并实现继承,封装,多态的特点。 因为在js中所有的函数既可以当成是构造函数,也可以当成普通函数调用,当函数当成构造函数调用时,该函数

    相关 js面向对象编程详解

    什么是面向对象编程(OOP)? 用对象的思想去写代码,就是面向对象编程 面向对象编程的特点 1. 抽象:抓住核心问题(把一样的放在一起) 2. 封装:只能通过对象来访

    相关 怎么理解js面向对象编程

    [怎么理解js的面向对象编程][js] 面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装、继承、多态的

    相关 js面向对象编程

    js面向对象编程 一、面向对象编程 1.面向过程与面向对象 1)面向过程:专注于如何解决一个问题的过程步骤,编程特点是由一个个函数去实现每一步的过程步骤,没有类和对象的概...