javaScript之继承的基础学习,实例讲解
程序员文章站
2022-04-13 16:04:44
前段时间,在面试中不停的会被提到继承。做一个关于继承的总结。关于对象之间的5中继承方式
若现在有对象“a”的构造函数:
function a()...
前段时间,在面试中不停的会被提到继承。做一个关于继承的总结。关于对象之间的5中继承方式
若现在有对象“a”的构造函数:
function a(){ this.species = "我是a"; }
还有一个对象“b”的构造函数:
function b() { this.name = "我是b"; }
如何操作,可以使得b继承到a中的方法?(很容易我们知道a相当于是父对象,b是子对象)
一、构造函数继承:使用call/apply方法,即:将父对象的构造函数绑定在子对象中。其实就是在子对象添加call/apply。
function b(){ //使用call继承 a.call(this); //使用apply继承: a.apply(this,arguments); this.name = "我是b"; } var b = new b(); console.log(b.species); //我是a console.log(b.name); //我是b
二、prototype模式:将子对象的prototype属性指向a,则b的实例中就有了a。
b.prototype = new a(); b.prototype.constructor = b; var b = new b(); console.log(b.species); //我是a console.log(b.name); //我是b
首先在代码的第一行中,使用b.prototype = new a(),将b的prototype属性指向了a的实例。也就是说完全删除了prototype对象原先值,重新加值。 在第二行中b.prototype.constructor = b是因为在原型的概念中,我们都知道任何一个函数都会有一个prototype属性。而他们的prototype属性都会有一个constructor属性,指向其的构造函数。通过让b的constructor重新指回原构造函数,防止造成继承紊乱。 如果在中替换了prototype对象,那么下一步就需要在新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数。
三、直接继承prototype:改写a对象,将不变的对象都直接写入a.prototype,所以可以通过b跳过a,直接继承a.prototype(改进上一中方法的继承方式)。
首先改写a对象:
function a(){ this.a = "b访问不到我" } a.prototype.aa = "b可以访问到我";
再将b的prototype指向a的prototype
b.prototype = a.prototype; b.prototype.constructor = b; var bb = new b(); console.log(bb.a); //undefined console.log(bb.aa); //b可以访问到我
使用这种模式的继承,优点是可以将b不需要继承到的东西放在构造函数内部使得实例化后的b无法访问,而节省了内存。缺点是因为b.prototype和a.prototype指向了同一个对象,所以会造成如果修改了b.prototype 都会影响到a.prototype。可以在上面的代码之后加入一句话判断是否是这样子的:
console.log(a.prototype.constructor); //b
四、利用空对象继承:改进上一个。不会污染到父对象。
var f = function(){}; f.prototype = a.prototype; b.prototype = new f(); b.prototype.constructor = b;
新申请的f是空对象,所以几乎不占内存。这时,修改b的prototype对象,就不会影响到a的prototype对象了。
五、拷贝继承:将父对象的所有属性和方法都拷贝在子对象上。
上面的都是采用prototype对象,实现继承。我们也可以换一种思路,纯粹采用”拷贝”方法实现继承。简单说,如果把父对象的所有属性和方法,拷贝进子对象,也就可以实现继承。
和之前的一样,将不需要b去继承的还是放在a的内部 将a的属性都放在a.prototype上 再写一个可以实现拷贝的目的的函数。这个函数的作用是将父级对象的prototype属性,拷贝在子对象的prototype上。
function extend(child,parent){ var p = parent.prototype; var c = child.prototype; for (var i in p){ c[i] = p[i]; } c.uber = p; }
使用方式:
extend(b,a); var b = new b();