继承—通过原型

1.共同

function A() {
   }
function B() {
   }

const g = {
   
  a: 1,
  b: 2,
};

我想让从A、B构造出来的对象都具有g其中的属性,就可以通过继承

A.prototype = g
A.prototype.constructor = A
console.log(A.prototype)//{ a: 1, b: 2, constructor: [Function: Man] }

const aa = new A()
console.log(aa.a)//1
console.log(aa.b)//2

const bb = new B()
console.log(bb.a)//1
console.log(bb.b)//2

这样我就达到目标了。

2.不同

有公共属性就有各自对应的属性,我如果只给A添加属性呢

A.prototype.c = 1

console.log(A.prototype)//{ a: 1, b: 2, constructor: [Function: B], c: 1 }
console.log(B.prototype)//{ a: 1, b: 2, constructor: [Function: B], c: 1 }

可以发现,我想让从A创造的对象都具有c = 1这一属性,但是它竟然给B也加上了,为什么呢?

因为A.prototype和B.prototype指向的同一个地址,给A.prototype添加一个属性,B同样能找到它

//将A和B再向上提取出一个等级,A、B都指向它 
function Word(){
   
    this.a = 1
    this.b = 2
}

//new Word()出来的对象,有了初始值 
还记得new的执行过程吗:
1.new fn(),创建一个对象;
2.this指向新的对象;
3.执行构造函数的代码,修改值;
4.obj形成。

console.log(new Word());//Word { a: 1, b: 2 }
console.log(new Word().constructor);//[Function: Word]

*JS的继承是通过prototype来传递的,那么只要让AB的prototype指向任意一个由Word生出来的对象就可以继承Word中的值*

function A(){
   }
A.prototype = new Word()
A.prototype.constructor = A

function B(){
   }
B.prototype = new Word()
B.prototype.constructor = B

A.prototype.c = 3

const aa = new A()
console.log(aa.__proto__);//Word { a: 1, b: 2, constructor: [Function: A], c: 3 }

const bb = new B()
console.log(bb.__proto__);//Word { a: 1, b: 2, constructor: [Function: B] }

原型链是什么?

访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。