2019独角兽企业重金招聘Python工程师标准>>>
再次阅读了阮一峰的Javascript面向对象编程的总结(http://www.ruanyifeng.com/blog/2010/05/object-oriented_Javascript_encapsulation.html ),对面向对象也有了新的认识。
面向对象的三大要素:多态,封装,继承。其中继承是用来实现多态的,而封装解决了数据抽象的问题。
我们来看看js是如何实现多态,封装和继承的:
封装
Javascript通过对象来实现封装:
function Animal(type,name){
this.type = type;
this.name = name;
}
Cat.prototype.eat = function(){ // do eat }
继承
有继承(改变父类则影响所有子类)和拷贝继承
继承
空对象中介方法,从而避免通过继承而改变了父对象的构造函数
function extend(Child, Parent) {
var F = {};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
}
拷贝继承(拷贝prototype)
function extend(Child, Parent) {
var p = Parent.prototype;
var c = Child.prototype;
for( i in p){
c[i] =p[i];
}
}
以上是使用构造函数来实现继承的,非构造函数继承的方式如下:
使用Protoytpe链
function extend(obj){
var F = function(){}
F.prototype = obj;
return new F();
}
拷贝继承,分为深拷贝和浅拷贝。即把父类的属性全都拷贝给子类。
function extendCopy(obj) {
var c = {};
for( var i in obj ) {
c[i] = obj[i];
}
c.cuber = p;
return c;
}
深拷贝
function extendDeep(p,c){
var c = c || {};
for(var i in p){
if(typeof p[i] ==='object'){
extendDeep()
}
}
}
多态
通过调用同子类的方法来实现多态。
总结
Javascript通过构造函数和原型链都可以实现继承,两者会冲突吗?同时有构造函数和原型链的目的原因是什么?
请阅读 Javascript构造函数和原型链