美文网首页
js面向对象

js面向对象

作者: super静_jingjing | 来源:发表于2018-03-13 14:28 被阅读0次

有java基础学习js的面相对象就容易很多,主要记录一下重点;

  1. 在js中没有class的概念,只有构造函数,或者说在js中构造函数其实就是class
    没有在构造函数中声明的,就是变量,在构造函数中的就是属性
    function,不在类中就是函数,在类中就是方法
    创建一个类的方式如下:
            function Person(name,sex){
                 this.name = name;
                 this.sex = sex;
                 function showName(){
                     alert(this.name);
                 }
                 function showSex(){
                     alert(this.sex);
                 }
             }
    
  2. prototype 原型
    作用其实就是给类添加属性或者方法
    1中的代码可以改为如下方式:
          function Person(name,sex){
               this.name = name;
               this.sex = sex;
           }
           Person.prototype.showName = function(){
               alert(this.name);
           }
           Person.prototype.showSex = function(){
               alert(this.sex);
           }
    
    优先级:直接给对象添加的优先级高于原型添加
  3. 在面相对象中,特别要注意this的使用;这里强调一点:但凡使用了定时器,定时器中的this指的都是window对象
  4. 继承:js并没有提供继承这个功能,可以通过其他方式实现
           function Person(name,sex){
                this.name = name;
                this.sex = sex;
            }
            Person.prototype.showName = function(){
                alert(this.name);
            }
            Person.prototype.showSex = function(){
                alert(this.sex);
            }
            function Worker(name,sex,job){
                //挑用父级的构造函数
                Person.call(this,name,sex);
                this.job = job;
            }
            //原型链    继承父级的方法
            Worker.prototype = Person.prototype;
            Worker.prototype.showJob = function(){
                alert(this.job);
            }
            var w = new Worker("name","sex","job");
            w.showJob();
            w.showSex();
    
    以上方式就实现了继承,但是有一个问题,当如下代码被执行时,发现Person被修改了
 alert(Person.prototype.showJob);
image.png

在Person中没有Job方法,这里反而能够访问到;
问题就是上面的Worker.prototype = Person.prototype;并不是进行了赋值,而是引用,后面对Worker修改,导致父类Person也被修改;下面使用简单的代码和图描述一下js中的引用
引用代码:

         var arr1 = [1,2,3];
          var arr2 = arr1;//这里只是引用,并没有真的去赋值
          arr2.push(4);//这里,arr1和arr2都成1,2,3,4,因为引用指向的是同一个东西,不管修改哪一个都会变化
          alert(arr1);//1,2,3,4
          alert(arr2);//1,2,3,4

初始化了一个arr1,这个时候arr1拥有如下的空间;var arr2 = arr1;这句代码的效果如下图,可见arr1和arr2拥有同一个空间,不管修改arr1还是arr2都修改了同一个空间


image.png

想要赋值只能采用以下方式

          var arr3 = [];          
          for(var i=0;i<arr1.length;i++){
               arr3[i] = arr1[i];
           }
           arr3.push(5);
           alert(arr1);//arr1不会改变
           alert(arr3);//arr3改变成1,2,3,4,5

所以继承的方式只能改成如下方式:

            function Person(name,sex){
                this.name = name;
                this.sex = sex;
            }
            Person.prototype.showName = function(){
                alert(this.name);
            }
            Person.prototype.showSex = function(){
                alert(this.sex);
            }
            function Worker(name,sex,job){
                //挑用父级的构造函数
                Person.call(this,name,sex);
                this.job = job;
            }
            //原型链    继承父级的方法;
            //Worker.prototype = Person.prototype;
            //所以这里需要改成循环方式
            for(var i in Person.prototype){
                Worker.prototype[i] = Person.prototype[i];
            }
            Worker.prototype.showJob = function(){
                alert(this.job);
            }
            alert(Person.prototype.showJob);

这里alert出的结果会是undefined

相关文章

  • JS面向对象精要(二)_函数

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(三)_理解对象

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(四)_构造函数和原型对象

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(五)_继承

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • js 面向对象和面向过程

    js 面向对象和面向过程

  • 面向对象OOP--JS

    作者:烨竹 JS面向对象简介 JS名言:万物皆对象 JS面向对象比PHP简单很多;因为JS中没有class关键字,...

  • JavaScript笔记(一)

    一、面向对象面向过程的区别 1、什么是js对象 js对象:属性和方法的集合,js所有数据都可以看成对象...

  • JS面向对象

    JS面向对象入门 1、面向对象语言概念面向对象语言主要包括 类、对象、封装、多肽。2、面向对象的编程思想面向过程思...

  • 2018-01-18

    js中的面向对象核心 js是基于对象的编程语言,在后面的学习中我们通过一种模式使其转化成为面向对象的语言。js面向...

  • 浅谈JS中的面向对象

    浅谈JS中的面向对象 本文主要说说本人在JS中对面向对象的理解。 计算机编程语言主要分为面向过程式编程和面向对象式...

网友评论

      本文标题:js面向对象

      本文链接:https://www.haomeiwen.com/subject/zzxzfftx.html