请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,setPrototypeOf是最好的解决方法吗

function PeopleNew (name, sex, age) {
  this.name = name
  this.sex = sex
  this.age = age
}

PeopleNew.prototype.info = function () {
  console.log(`${this.name},性别:${this.sex},现年${this.age}`)
}

function ChinesePeopleNew (name, sex, age, national) {
  PeopleNew.call(this, name, sex, age)
  this.national = national
}

ChinesePeopleNew.prototype.getHuKou = function () {
  console.log('getHuKou')
}

function __extends (son, parent) {
  function MiddleNew () {
    this.constructor = son
  }
  MiddleNew.prototype = parent.prototype
  return new MiddleNew()
}

ChinesePeopleNew.prototype = __extends(ChinesePeopleNew, PeopleNew)

上面的代码是最开始实现寄生组合式的代码,也是改变了子构造函数的原型对象空间指向,导致其方法失效

function PeopleNew (name, sex, age) {
  this.name = name
  this.sex = sex
  this.age = age
}

PeopleNew.prototype.info = function () {
  console.log(`${this.name},性别:${this.sex},现年${this.age}`)
}

function ChinesePeopleNew (name, sex, age, national) {
  PeopleNew.call(this, name, sex, age)
  this.national = national
}

ChinesePeopleNew.prototype.getHuKou = function () {
  console.log('getHuKou')
}

function __extends (son, parent) {
  function MiddleNew () {
    this.constructor = son
  }
  MiddleNew.prototype = son.prototype
  MiddleNew.prototype.__proto__ = parent.prototype
  return new MiddleNew()
}

ChinesePeopleNew.prototype = __extends(ChinesePeopleNew, PeopleNew)

其实稍加改动之后,也可以满足在原型对象空间上如果找不到该方法,就可以在原型对象空间的原型对象空间中找到该方法,实现继承的效果

那是不是说,其实每种方法都一样可以解决这个问题

那么是不是说其实只要子构造函数的原型链存在某一个构造函数的方法,就是继承了这个构造函数,也就是可以解释成和用什么方法加上去的无关

正在回答

2回答

这里有个容易被忽视的问题,如果建立符合 OOP的继承,不应该用setPrototypeOf方法,因为

 class ChinesePeople extends People {// OOP继承规定:继承建立之后再定义的子类方法才可以被之后创建子类对象调用。 继承之前定义的方法应该失效或只能被继承之前的对象调用【那时还不叫子类对象,和继承无关】,

而实际上 这也符合继承要求,子类方法的定义发生在子类产生之后,保证代码的高内聚性!

        study(){

        }  ‘

}


0 回复 有任何疑惑可以回复我~
  • 提问者 目訫 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2022-03-17 19:15:34
jonben 2022-03-16 08:51:30

这样也行,其实跟setPrototypeOf是一个道理,都是改变其原型链的__proto__

0 回复 有任何疑惑可以回复我~
  • 这里有个容易被忽视的问题,如果建立符合 OOP的继承,不应该用setPrototypeOf方法,因为
    
     class ChinesePeople extends People {// OOP继承规定:继承建立之后再定义的子类方法才可以被之后创建的子类对象调用。 继承之前定义的方法应该失效或只能被继承之前的对象调用【那时还不叫子类对象,和继承无关】,
    
    而实际上 这也符合继承要求,子类方法的定义发生在子类产生之后,保证代码的高内聚性!
    
            study(){
    
            }  ‘
    
    }
    回复 有任何疑惑可以回复我~ 2022-03-17 11:23:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信