js常见知识点3.面向对象之继承、设计模式

一、面向对象的三大特征

  建议回复: 
  封装:屏蔽内部细节、调用外部接口实现对应功能(函数调用)
  继承:子类继承父类中的属性和方法
  多态(js中不存在多态的概念)

二、继承

  建议回复:  
  继承:子类继承父类中的属性和方法 , 这些属性和方法在子类中不需要实现过程
  继承的种类:
       单继承:一个子类只拥有一个父类
       多继承:一个子类可以拥有多个父类

三、继承的方式及实现过程

  建议回复:
  1.继承方式一、通过改变构造函数(父类)的执行环境 ---在子类中添加一个特殊属性,这个属性值指向父类。
<script>
    function Father(){
        this.money="1个亿";
        this.eat=function(){
            console.log("eat meat!");
        }
        this.drink=function(){
            console.log("drink wine!");
        }
    }
    function Son(){
        this.parent=Father;//为子类添加一个特有的属性 改变父类的执行环境
        this.parent();//改变了执行环境
        
        delete this.parent;//继承完父类属性方法之后就可以把这个属性删了,注意:delete只能删除实例属性
    }
    var son=new Son();
    console.log(son.money);
    console.log(son.parent);
</script>

 

  2.继承方式二、通过call方法实现。  

    call方法使用:
         父类.call(子类[,子类继承父类的属性]); 
<script>
    function Father(firstname){
        this.firstname=firstname;
        this.money=200000000;
        this.drink=function(){
            console.log("drink coffe");
        }
        this.dance=function(){
            console.log("dancer is not dance");
        }
    }
    function Father2(){
        this.money2=300000000;
    }
    function Son(firstname,score){
        this.score=score;
        Father.call(this,firstname);
        Father2.call(this);
    }
    var son=new Son("dancer",90);
    console.log(son);
</script>

 

  3.继承方式三、通过apply继承.    

    apply使用方法:
         父类.apply(子类对象,数组)  数组中存储的是从父类继承过来的属性 
<script>
  function xiaomi5(price,size,memsize){ this.price = price; this.size = size; this.memsize = memsize; this.phoneCall = function(){ console.log("打电话"); } this.sendMessage = function(){ console.log("发短信"); } } function xiaomi5Plus(price,size,memsize,color){ this.color = color;//特有属性 //xiaomi5.apply(this,[price,size,memsize]); xiaomi5.apply(this,arguments);//通过arguments接收 this.playMusic = function(){ return "播放音乐"; } this.photo = function(){ console.log("照相"); } } var xm = new xiaomi5Plus(789,7,64,"white"); console.log(xm);

</script>

  4.继承方式四、原型继承.

    缺点:原型继承 继承实例属性时, 子类的属性值和父类相同

     function Father(age){
          this.age = age;
          this.money = 2000000;
          this.drink = function(){
              console.log("喝酒");
          }
     }
     Father.prototype.liaomei = function(){
          console.log("撩妹");
     }
     function Son(){

     }

     Son.prototype = new Father(38);//原型继承

     var son = new Son();
     //son.liaomei();

     alert( son.age );

  5.继承方式五、混合继承.    

    通过apply或call继承实例属性
    通过原型方式 继承 原型方法
  
    function Father(money,firstname){
          this.money = money;
          this.firstname = firstname;
     }

     Father.prototype.dance = function(){
          console.log("跳舞");
     }
     Father.prototype.sleep= function(){
          console.log("睡觉");
     }

     function Son(money,firstname){
          Father.call(this,money,firstname);
     }

     //原型继承
     Son.prototype = new Father();

     var son = new Son("200000","王");
     son.dance();

 

四、原型对象   prototype

  建议回复:  
  每一个构造函数都有一个prototype属性     实现:  构造函数.prototype
  每一个构造函数new出来的对象都有一个prototype属性     实现 :  对象.__proto__        指向的是prototype 
  

五、原型模式的执行流程

  建议回复:  
  1、先查找实例属性和实例方法,如果有实例属性或实例方法,就返回 该实例属性或实例方法的结果
  2、如果没有实例属性或实例方法,就去原型中查找,如果有原型属性或原型方法,就返回,如果没有,返回undefined

六、原型中的几个关键字(扩展)

  建议回复: 
  1.测试某个对象是否属于某个类的方法 isPrototypeOf()
    语法: 构造函数.prototype.isPrototypeOf(对象):判断一个对象是否指向了该构造函数的原型对象,可以使用isPrototypeOf()方法来测试               结果为boolean类型  同  instanceof 
     如:
    var arr = [];
    alert( arr instanceof Array )
 
  2.delete :删除实例属性
    语法 :  delete  对象.实例属性
 
  3.hasOwnProperty() 判断某一个对象是否包含该实例属性, 包含返回true,否则返回false   
    语法: 实例对象.hasOwnProperty("实例属性")
 
  4.in 是否存在该属性(原型或实例中)
    语法: "属性" in  对象实例

七、设计模式的概念及几种常见的设计模式

  建议回复:  
  1、什么是设计模式?    
    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、  让代码更容易被他人理解、保证代码可靠性。
 
  2.设计模式之单例模式
我一路向北,离开有你的季节...
原文地址:https://www.cnblogs.com/dancer0321/p/6833206.html