js继承,为什么ClassB.prototype.__proto__ = ClassA.prototype不能用?

先贴代码

function ClassA(name) {
    this.name = name
}

ClassA.prototype.sayName = function () {
    // 省略
}

function ClassB(name, age) {
    ClassA.call(this, name)
    this.age = age
}

// 为什么下面这句不能用???
ClassB.prototype.__proto__ = ClassA.prototype

ClassB.prototype.sayAge = function () {
    // 省略
}

let instance = new ClassB('小明', 11)

如题,为何在实现继承中,ClassB.prototype.__proto__ = ClassA.prototype不能用?

阅读 2.5k
3 个回答

可能是你浏览器不支持吧。不过不推荐直接操作__proto__属性

function ClassA(name) {
    this.name = name
}

ClassA.prototype.sayName = function () {
    // 省略
}

function ClassB(name, age) {
    ClassA.call(this, name)
    this.age = age
}

// 效果等同于ClassB.prototype.__proto__ = ClassA.prototype
ClassB.prototype = Object.create(ClassA.prototype)

ClassB.prototype.sayAge = function () {
    // 省略
}

let instance = new ClassB('小明', 11)

__proto__是浏览器为了让你能访问对象的原型而添加的属性,不是标准吧,只有在部分浏览器里才可以使用,你可以这样修改一下:

function ClassA(name) {
      this.name = name
    }

    ClassA.prototype.sayName = function () {
      alert(this.name)
    }

    function ClassB(name, age) {
      ClassA.call(this, name)
      this.age = age
    }

    ClassB.prototype.constructor.prototype = ClassA.prototype // 使用constructor.prototype 访问原型

    ClassB.prototype.sayAge = function () {
      alert(this.age)
    }

    let instance = new ClassB('小明', 11)
    instance.sayName(); //小明
    instance.sayAge();  //11

Object.prototype.__proto__,事实证明可以使用

function ClassA(name) {
      this.name = name
    }

    ClassA.prototype.sayName = function () {
      alert(this.name)
    }

    function ClassB(name, age) {
      ClassA.call(this, name)
      this.age = age
    }

    ClassB.prototype.__proto__ = ClassA.prototype

    ClassB.prototype.sayAge = function () {
      alert(this.age)
    }

    let instance = new ClassB('小明', 11)
    instance.sayName(); //小明
    instance.sayAge();  //11
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题