闲聊javascript继承和原型

时间:2022-03-14 15:01:53

javascript继承已经是被说烂的话题了,我就随便聊一点~

一、javascript的复制继承

javascript的继承有复制继承和原型继承,基于复制继承用的不太多,而且无法通过instanceof的验证

//拷贝继承,prototype.js的extend=>
function extend(destination,source){
for(var property in source)
destination[property]
=source[properyt];
return destination;
}

二、javascript原型继承

js原型继承是基于原型链查找的,js每个函数都有prototype属性和__proto__属性,每个实例的__proto__属性都指向函数的prototype(es6里面实例的__proto__都指向这个函数),下面这个例子证明了这个观点。

function A(){
console.log(
this.__proto__.aa);//1
this.aa=2
}
A.prototype
={
aa:
1
}
var a=new A;
console.log(a.aa);
//2
a.__proto__={
aa:
3
}

delete a.aa;//删除特权属性
console.log(a.aa);//3

 实例在查找方法的时候按原型链查找,先找自身的属性,没有就到构造函数的prototype里找,没有再到构造函数的构造函数的prototype里找,只到Function的prototype。那我们让a的prototype等于A的实例,不就完成了继承了么。

function A(){}
A.prototype
={
aa:
1
}
function bridge(){};
bridge.prototype
=A.prototype;
function B(){}
B.prototype
=new bridge();
B.prototype.constructor
=B;

这里继承是用了一个bridge函数做了桥,因为当A有很多内容的时候,实例化A消耗比较多,而且并没有什么用,就用一个空函数做桥接一下。这里最后再改一下实例的构造函数指向自己,这就完成了继承。

var b=new B;
B.prototype.cc
=function(){
alert(
3)
}
console.log(b.__proto__
==B.prototype);//true
console.log(b.__proto__.__proto__===A.prototype);//true

这里b的__proto__是指向构造函数的prototype的。