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