一、工厂模式创建对象及优缺点

  继承就是把公共的部分抽象出来作为父类,基类。吃饭,跑步等

  var a = {};  //批量创建不方便,不能重复设置公共属性的代码

  //工厂模式出现了,创建10个Cat对象 每个对象都有年龄、姓名的属性,包括run方法  注意区分 js高级-函数的四种调用模式

  function createCat(age,name){

    var o = new Object();

    o.age = age;

    o.name = name;

    o.run = function (){

      console.log(o.name + 'running...')

    }

    return o;

  }

  var c = createCat(19,'xixi')

  //缺点 c的原型   构造函数是Object  方法不共享

二、构造函数模式创建对象

  function Cat(age,name){

    this.name = name;

    this.age = age;

    this.run = function(){

      console.log(this.name + 'running..')

    }

  }

  var c1 = new Cat(19,'kk')  //当使用new调用构造函数时候 创建空对象 把空对象赋值给this  执行构造函数里面代码

  c1 instanceof Cat   //true

  c1.constructor === Cat

  //缺点 对象的方法不共享

三、原型模式创建对象

  function Cat(){

    this.age = 19;

  }

  Cat.prototype.run = function (){

    console.log(this.name,this.age)

  }

  Cat.prototype.name = 'black cat'

  var c1 = new Cat()

  var c2 = new Cat()

  c1.name == c2.name  //所有的name共享的

  c1.run == c2.run

  

四、组合构造函数模式与原型模式构造对象  (经典创建对象模式)

  

  function Cat(age,name){  //一般构造函数的首字母大写 称为类

    this.name = name;

    this.age = age;

  }

  Cat.prototype.run = function(){

    console.log(this.name + 'running...')

  }

  var c1 = new Cat(19,'kk')

  c1.run()

  

  

面向对象继承

  原型继承模式

    function Animal(age,name){

      this.name = name;

      this.age = age;

      this.foods = ['桃子','苹果']

    }

    //动物基类的原型上添加方法run

    Animal.prototype.run = function(){

      console.log(this.name + 'running....')

    }

    function Cat(age,name){

      this.name =name;

      this.age = age;

    }

    //原型继承方式

    Cat.prototype = new Animal(); //new Animal()对象实例 有constructor属性 因为它的 prototype有这个属性 继承下来所以 实例对象也有这个属性

    Cat.prototype.constructor = Cat;  //因为new Animal()对象的constructor指向Animal 所以需要重新指向一下

    var c = new Cat(19,'ss')  //继承父类的方法  因为Cat的原型指向Animal对象了 然后对象的原型有run方法

    c.run();  //c先找自己没找到 找原型 ->Animal 对象 然后animal对象继续找,找不到 找animal原型 有run方法。

    //问题 1 子类的构造函数的参数没法传递给父类的构造函数

    // 2 constructor 需要改回来

    //3 如果父类有引用类型 那么所有子类共享这个应用类型(一个对象修改了其他对象也改变)

  组合继承模式 原型继承和借用构造函数继承   父类原型上的属性方法进行继承下来  父类构造函数定义的实例属性继承下来

    function Animal(age,name){

      this.name = name;

      this.age = age;

      this.foods = ['桃子','苹果']

    }

    Animal.prototype.run = function(){

      console.log(this.name + 'running....')

    }

    //定义子类

    function Cat(age,name){

      //Animal(age,name)  //this === window 函数执行模式

      //this == c对象

      Animal.call(this,age,name)  //函数调用模式  相当于用c对象(this)调用Animal方法  借用父类的构造函数给子类创建实例属性

    }

    Cat.prototype = new Animal();  //继承Animal上的方法

    Cat.prototype.constructor = Cat;

    var c = new Cat(19,'kk')

    //缺点 调用了两次Animal() 父类的构造函数

  

  原型式继承模式    //把一个对象作为另外一个对象的原型  将对象进行了一些扩展

    function object(o){

      function F(){}

      F.prototype = o

      return new F();

    }

    var m = {age:19,name:'kk',friends:['aa','bb']}

    var m1 = object(m)

    console.log(m1.friends)

    //优点 不需要使用new 构造函数就可以构造

    // 缺点 所有构造出来的实例会共享原型对象上引用类型的属性   es6 Object.create();

  寄生继承模式  //把一个对象作为另外一个对象的原型  将对象进行了一些扩展

    function createPersion(p){

      var o = object(p);

      o.say = function (){

        console.log('hi')

      }

      return o;

    }

  寄生组合继承模式

    function Animal(age,name){

      this.name = name;

      this.age = age;

      this.foods = ['桃子','苹果']

    }

    //父类原型上的方法通过寄生来实现  Cat.prototype = new Animal() 执行了一次父类的构造函数

    Animal.prototype.run = function(){

      console.log(this.name + 'running...')

    }

    

    function Cat(age,name){

      //借用构造函数继承模式 构建对象的实例属性

      Animal.call(this,age,name)  // this去调用Animal  把父类的属性通通挪到子类实例自己身上了 this.name this.....  this代表子类自身 同时引用类型也不存在共享了

    }

    //寄生继承的方法  将Animal原型上的方法继承下来

    Cat.prototype = inheritFrom(Animal.prototype)

    var c = new Cat(19,'kk')

    //寄生继承模式

    function inheritFrom(o){

      var t = object(o)

      t.constructor = Cat;

      return t;

    }

    //原型式继承的方法

    function object(o){

      function F(){}

      F.prototye = o

      return new F();

    }

闭包模拟私有属性

function Persion(){

  var age = 0;  //私有变量 只能通过 getAge setAge来操作

  this.getAge = function(){

    return age;

  }

  this.setAge = function(a){

    age = a;

  }

}

var p = new Persion();

console.log(p.getAge())

p.setAge(90)

//第二种写法

function Persion(){

  var age = 0;

  return {

    getAge:function(){

      return age;

    },

    setAge:function(num){

      age = num;

    }

  }

}

var p = new Persion();

console.log(p.getAge())

p.setAge(90)

js高级-面向对象继承的更多相关文章

  1. JS高级 - 面向对象5(继承,引用)

    <script type="text/javascript"> //------------------Person类 //(Person)的构造函数 function ...

  2. JS高级---总结继承

    总结继承 面向对象特性: 封装, 继承,多态 继承, 类与类之间的关系, 面向对象的语言的继承是为了多态服务的   js不是面向对象的语言, 但是可以模拟面向对象,模拟继承,为了节省内存   继承: ...

  3. JS高级 - 面向对象1(this,Object ,工厂方式,new )

    面向对象三要素: 封装 继承 多态 1.this 详解,事件处理中this的本质 window this -- 函数属于谁 <script type="text/javascript& ...

  4. JS难点--面向对象(继承)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } 继承 让一个对象拥有另一个对象的属性或者 ...

  5. JS高级---拷贝继承:把一个对象中的属性或者方法直接复制到另一个对象中

    拷贝继承:把一个对象中的属性或者方法直接复制到另一个对象中 浅拷贝 function Person() { } Person.prototype.age = 10; Person.prototype. ...

  6. JS高级---面向对象的编程思想(贪吃蛇梳理)

    面向对象的编程思想(贪吃蛇梳理) 模拟贪吃蛇游戏,做的项目 地图: 宽,高,背景颜色,因为小蛇和食物都是相对于地图显示的, 这里小蛇和食物都是地图的子元素, 随机位置显示, 脱离文档流的, 地图也需要 ...

  7. JS高级 - 面向对象4(json方式面向对象)

    把方法包在一个Json里 var p1 = { name: "唐三", sex: "男", dreamdu: { URL: "www.dreamdu. ...

  8. JS高级 - 面向对象3(面向过程改写面向对象)

    改写: 1.前提:所有东西都在 onload 里 2.改写:不能有函数嵌套,可以有全局变量 onload --> 构造函数 全局变量 --> 属性 函数 --> 方法 4.改错: t ...

  9. JS高级 - 面向对象2(prototype定义)

    定义和用法 prototype 属性允许您向对象添加属性和方法 注意: Prototype 是全局属性,适用于所有的Javascript对象. 语法 object.prototype.name=val ...

随机推荐

  1. es6基础(2)--解构赋值

    //解构赋值 { let a,b,rest; [a,b]=[1,2]; console.log(a,b); } //数组解构赋值 { let a,b,rest; [a,b,...rest]=[1,2, ...

  2. CentOS、Ubuntu、Debian简析

    Centos .Ubuntu.Debian 三个Linux都是非常优秀的系统,开源的系统,也分付费的商业版和免费版,下面简单比较这三种系统. Centos系统 非常多的商业公司部署在生产环境上的服务器 ...

  3. 数据库设计和ER模型-------之关系模型的基本概念(第二章)

    关系模型的基本术语 定义:用二维表格来表示实体集,用关键码表示实体之间联系的数据模型称为关系模型 有时也习惯称呼关系为表或表格,元组为行(Row),属性为列.关系中属性个数称为“元数”,元组个数称为“ ...

  4. 500 OOPS: could not read chroot() list file:/etc/vsftpd/chroot_list

    出错原因:用户没有变更根目录的权限. ftp用户默认的根目录是/home/ftp,如果要切换登陆目录,需要给予权限 解决方法: 第一步, 打开/etc/vsftpd/vsftpd.conf,做如下配置 ...

  5. Ruby学习笔记4: 动态web app的建立

    Ruby学习笔记4: 动态web app的建立 We will first build the Categories page. This page contains topics like Art, ...

  6. Maintenance Planner calculate SPs by manual

    note Are you unable to view your system or updated system information? Apply the latest version of t ...

  7. 关于thinkphp5被入侵后的一些思考

    最近一段时间thinkphp5爆出漏洞  request.php中的请求过滤不严 是得web端 可以直接写入一个文件到服务器上 进而可得webshell权限 我的一个客户 就是这样被入侵了   刚开始 ...

  8. 41.纯 CSS 绘制一支栩栩如生的铅笔

    原文地址: https://segmentfault.com/a/1190000015153865 感想: 不难 HTML code: <div class="pencil" ...

  9. log-bin

    装mysql,运行一段时间后,在mysql目录下出现一堆类似mysql-bin.000***,从mysql-bin.000001开始一直排列下来,而且占用了大量硬盘空间,高达几十个G. 对于这些超大空 ...

  10. canal 入门

    参考文章:Canal - 安装   https://www.aliyun.com/jiaocheng/1131288.html?spm=5176.100033.2.7.7b422237XAirIe 前 ...