方法一: (直接prototype等号赋值,缺点:地址相同,修改B原型链,A同步被修改)
function A(opt){
this.name = opt.name
this.age = opt.age
}
A.prototype.sayName = function(){
console.log(this.name)
}
function B(opt){
A.call(this,opt)
this.sex = opt.sex
}
B.prototype = A.prototype
B.prototype.sayAge = function(){
console.log(this.age)
}
const o2=new B({
name:"蜘蛛侠",
age:"19",
sex:"man"
})
console.log(o2)

方法二: (B.prototype = new A({}) 缺点:函数与声明的变量都赋值了)
B.prototype = new A({})
B.prototype.sayAge = function(){
console.log(this.age)
}

方法三: (方法1与2的结合,既不地址相同 也不继承不需要的属性)
function c(){}
c.prototype = A.prototype
B.prototype = new c()
B.prototype.sayAge = function(){
console.log(this.age)
}

方法四:(遍历需继承方法的prototype即可,但是.prototype.prototype继承不了)
for(var key in A.prototype){
B.prototype[key] = A.prototype[key]
}
B.prototype.sayAge = function(){
console.log(this.age)
}
