请稍等 ...
×

采纳答案成功!

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

关于es6类的继承是否可以由以下es5所实现的?

class A {

}

class B extends A {

}
// 下面构造函数是不是可以简单理解为 类继承的实现

// B.proto === A;
function A1() { }

function B1() {
A1.apply(this,arguments)
}

// B.prototype.proto === A.prototype;
B1.prototype = new A1()

// proto==> 实则为 前后双下划线proto

正在回答 回答被采纳积分+3

1回答

keviny79 2021-12-05 19:14:03

 问题说明:使用__proto__ 建立继承带来不好的问题:

1. 原因1:修改原型或对象的原型链属性__proto__(就是[[Prototype]])是一个不好的编码习惯

   它改变了原型链的链级指向关系,破坏了原型链的稳定性,导致原型链上依赖的方法和属性都会受到影响

   举个例子

例子:

let son = new Son("爱好篮球", "男");// S100

Son.prototype.__proto__ = Parent.prototype// S101

Son.prototype.constructor = Son;// 让Son类的对象或函数原型.prototype指向的原型对象空间【new Parent()对象空间】有一个constructor属性

console.log("Son.prototype来看看:", Son.prototype);

console.log("abc..哦哦");

son.eat();// S102 调用 Parent原型上eat()方法成功


问题解说:

  我们并不希望S100行创建的son对象变量在S102处能调用 Parent.prototype 上的方法,因为它是我们 S101 行 改变指向之前创建的son对象,但是实际能调用,  这就是修改__proto__代码带来的问题!

0 回复 有任何疑惑可以回复我~
  • 提问者 zhangkaili #1
    嗯嗯,老师意思我理解,不要直接修改Son.prototype.__proto__属性的值,会影响到所有通过Son构造函数new出来的实例的原型链.我想表达的是类的继承 实则是通过 Object.setPrototypeOf(B,A);Object.setPrototypeOf(B.prototype,A.prototype);来实现,这两个方法如果使用构造函数来实现的话是否可以通过上面两个构造函数来简单的实现,分别为构造函数B1继承构造函数A1,B1.prototype继承A1.prototype
    回复 有任何疑惑可以回复我~ 2021-12-06 00:15:31
  • keviny79 回复 提问者 zhangkaili #2
    1.Object.setPrototypeOf(B,A) 继承的是静态函数和静态属性,
    2. Object.setPrototypeOf(B.prototype,A.prototype); 结果为B.prototype.__proto__=A.prototype,依然存在直接修改原型链的问题
    3.这里之所以讲解middle 手写的寄生组合继承,有两个原因 1. TS继承底层用到这种手写模式   2. 手写模式的扩展性和灵活性更高一些,比如增加一些日志代码等。
    4.后面会讲到用Object.create来实现寄生组合继承
    回复 有任何疑惑可以回复我~ 2021-12-07 17:30:04
  • 提问者 zhangkaili 回复 keviny79 #3
    《2. Object.setPrototypeOf(B.prototype,A.prototype); 结果为B.prototype.__proto__=A.prototype,依然存在直接修改原型链的问题》 关于这块问题,是否可以理解为对象之间只要存在继承关系,继承者和被继承者都可通过__proto__属性直接修改原型链??
    回复 有任何疑惑可以回复我~ 2021-12-07 23:15:24
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信