02 js原型链

1 js原型链是一个绕不开的话题。直接上说吧。

/**
* 1. js里的原型链是怎么样的? 带class 和不带class的原型链的不同。
*/ const util = require('util');
function A() {
console.info("I am A ");
} function B() {
console.info("I am B ");
} function C() {
console.info("I am C ");
} util.inherits(B, A);
util.inherits(C, B);
class CA {
constructor(){
console.info("i am CA");
} doCA(){
console.info(" doCA ");
}
} class CB extends CA{
constructor(){
super();
console.info("i am CB");
} doCB(){
console.info(" do CB ");
}
} class CC extends CB {
constructor(){
super();
console.info("i am CC");
} doCC(){
console.info(" i am doCC");
}
} //原型链继承如下:
var c = new C();
console.info( c.__proto__ === C.prototype);
console.info(c.__proto__.__proto__ === B.prototype);
console.info(c.__proto__.__proto__.__proto__ === A.prototype);
console.info(c.__proto__.__proto__.__proto__.__proto__ === Object.prototype);
console.info(c.__proto__.__proto__.__proto__.__proto__.__proto__ === null); //class
var cc = new CC();
console.info(cc.__proto__ === CC.prototype);
console.info(cc.__proto__.__proto__ === CB.prototype);
console.info(cc.__proto__.__proto__.__proto__ === CA.prototype);
console.info(cc.__proto__.__proto__.__proto__.__proto__ === Object.prototype);
console.info(cc.__proto__.__proto__.__proto__.__proto__.__proto__ === null); //下面是类的继承关系。class和非class是不同的
console.info("类继承关系");
console.info(C.prototype.constructor === C);//C的原型的构造 = 本身
console.info(C.__proto__ === Function.prototype);//所有的类的__proto__指向Function的原型,即构造主的原型。
console.info(Function.__proto__ === Function.prototype);// console.info("带class的类继承关系");
console.info(CC.__proto__ === CB);//带class 的CC的__proto__指向,cb, 最终最想 Function的原型。
console.info(CC.__proto__.__proto__ === CA);
console.info(CA.__proto__ === Function.prototype);

原型链要记住一下几点:

1. 每个东西都有 __proto__

2. 类的prototype = 类的原型。 类的原型的 construct = 类。

3. 小c的__proto__ = C的原型,C的原型的__proto__= B的原型, B的原型的__proto__ = A的原型 , A的原型的 __proto__ = Object的原型,Object的原型的__proto__ = null;这就是原型链,很简单吧。

4. 用class 继承时, CC的__proto__ = CB, CB的__proto__ = CA, CA的__proto__ = Function的原型。

用util.inherits 实现继承时, C,B,A, Function的__proto__ 都等于 Function的原型。

只要把上面都记住,多练习,就可以很好的掌握原型链。

以上如果还没有看懂的话,可以参考:https://blog.csdn.net/m0_37589327/article/details/78655038

上一篇:从文件中读取数组数据————Java


下一篇:mysql常用函数汇总