前言:js是面向过程,不是面向对象
面向对象:
我们可以通过 new Object()和字面量创建,但是这两种方法不能判断对象归属问题以及不能批量产出对象,所以有了工厂模式,工厂模式是在函数中new一个对象,给对象赋值,然后return 对象,工厂模式解决了批量的问题,但是还是没有解决对象归属问题。所以又有了构造函数模式,构造函数解决了对象的归属问题,但是构造函数创建的对象的方法不能共享,每个对象都会创建方法,造成内存开销特别大,所以产生了原型的解决方法。我们一般情况下会采用构造函数和原型混合的模式来创建对象,利用构造函数创建实例对象,利用原型创建方法和共享属性。可以看出,混合模式共享着对相同方法的引用,又保证了每个实例有自己的私有属性。最大限度的节省了内存
那么下面我们来说一下Es5的继承方式
第一种:原型链继承
把父类的实例赋值给子类原型
父类的实例作为子类的原型
function Woman(){ } Woman.prototype= new People(); Woman.prototype.name = 'haixia'; let womanObj = new Woman();
优点:
缺点:
第二种:借用构造函数继承
function Woman(name){
//继承了People
People.call(this); //People.call(this,'tom);
this.name = name || 'kitty'
}
let womanObj = new Woman();
优点:
缺点:
第三种:实例继承
function Wonman(name){
let instance = new People();
instance.name = name || 'wangxiaoxia';
return instance;
}
let wonmanObj = new Wonman();
优点:
-
不限制调用方式
-
简单,易实现
缺点:
- 不能多次继承
第四种:组合继承
function People(name,age){
this.name = name || 'wangxiao'
this.age = age || 27
}
People.prototype.eat = function(){
return this.name + this.age + 'eat sleep'
}
function Woman(name,age){
People.call(this,name,age)
}
Woman.prototype = new People();
Woman.prototype.constructor = Woman;
let wonmanObj = new Woman(ren,27);
wonmanObj.eat();
后续更新!!!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。