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

时间:2022-06-19 14:33:01

一、面向对象的三大特征

  建议回复: 
  封装:屏蔽内部细节、调用外部接口实现对应功能(函数调用)
  继承:子类继承父类中的属性和方法
  多态(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 
  js常见知识点3.面向对象之继承、设计模式

五、原型模式的执行流程

  建议回复:  
  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.设计模式之单例模式