再谈Javascript面向对象编程

再次阅读了阮一峰的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构造函数和原型链

你可能感兴趣的:(再谈Javascript面向对象编程)