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

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

  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. 常见sql注入的防范总结

    在平时的开发过程中,我们可能很少会刻意的去为项目做一个sql注入的防范,这是因为你可能因为使用了某些框架,而无意间已经有了对应sql注入的一些防范操作(比如mybatis使用#{XX}传参,属于预编译 ...

  2. Struts2学习:Action获取properties文件的值

    配置文件路径: 配置内容: 方法一: Action内被调用的函数添加下段代码: Properties props = new Properties(); props.load(UploadFileAc ...

  3. python r(不进行转义)的用法

      第一种用法,直接针对字符串:r‘E:\ui\bbq.txt’ 第二种用法,针对变量名:r'' + 变量名

  4. Redis数据结构深入解析

  5. python学习之----BeautifulSoup示例二

    网络爬虫可以通过class 属性的值,轻松地区分出两种不同的标签.例如,它们可以用 BeautifulSoup 抓取网页上所有的红色文字,而绿色文字一个都不抓.因为CSS 通过属性准 确地呈现网站的样 ...

  6. 【数据分析方法论】指标_DAU/MAU

    背景 选择好的指标,就已经完成了一半的分析. 从入行数据分析开始定指标时的纠结,到现在已经可以相对比较熟悉这个路子了.从现在开始是一个积累好指标的阶段.而这里要谈的一个指标是:DAU/MAU. 资料收 ...

  7. 学习笔记:python3,代码。小例子习作(2017)

    http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...

  8. vs2008发布项目失败的解决方法

    解决办法: 要知道发布是怎么失败的,用组合键"Ctrl+Alt+O"即可,仔细查看信息可发现有没发布成功的详细提示,然后在资源管理器中找到那一项,删除或排除到项目外,重新生成之后再 ...

  9. js window.open隐藏参数提交

    1.采用form方式提交 var url = "page/public/exportExcel.jsp"; //create a form var tempForm = docum ...

  10. ThinkPHP模板内使用U方法

    为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响. 三种携带 ...