js中为什么不能使用__prototype__调用父类上面的方法呢

1.在父类和子类上面都实现了一个相同的方法,但是想有时候使用父类方法,有时候使用子类方法,代码是这样的

function A () {
      this.name = 'testA'
    }
    A.prototype.sayName = function () {
      console.log('A')
    }
    function B () {
      A.call(this)
      this.name = 'testB'
    }
    B.prototype = Object.create(A.prototype)
    B.prototype.sayName = function () {
        console.log('B')
    }
    var a =  new A()
    a.sayName()
    var b = new B()
    b.sayName()
    b.__proto__.sayName() //输出B  这为什么输出的不适A
    
    
  为什么不能使用__proto__ 来调用父类上面的sayName方法呢?  
阅读 3.2k
5 个回答

楼主的本意应该是
1.B原型继承了A,B应该有A的所有属性及方法;
2.但是,从你的代码中看出你的继承关系已经出现错误,如果B想继承A的所有属性,正确的写法为,B.prototype =
new A();
3.由于你在继承A之后又重新在原型上定义与A相同的属性,这样会覆盖之前继承的A的属性,导致最后输出的结果为
B。
4.如果B继承了A,那么B拥有A的所有属性,所以,不用b.__proto__直接b.sayName就可以拿到A(用你现在的代码得到的还是B)
在你代码基础上更改:

function A () {
  this.name = 'testA'
}
A.prototype.sayName = function () {
  console.log('A')
}
function B () {
  A.call(this)
  this.name = 'testB'
}
B.prototype = new A();
B.prototype.sayName = function () {
    console.log('B')
} //当前会覆盖A的相同属性
var a =  new A()
a.sayName()
var b = new B();
b.sayName()
b.sayName()//输出B  这为什么输出的不适A

b.__proto__.sayName()调用的是B.prototype.sayName()b.__proto__.__proto__.sayName()才是你想要的结果。

并且,非常不推荐使用这种写法,__proto__并非标准,是现代浏览器自己实现的一个接口,请使用Object.getPrototypeOf()代替

这个很明显,因为你已经设置了

B.prototype.sayName = function () {
        console.log('B')
    }

搞清楚什么叫原型链

b.__proto__指向B.prototype

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题