采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
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
问题说明:使用__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__代码带来的问题!
嗯嗯,老师意思我理解,不要直接修改Son.prototype.__proto__属性的值,会影响到所有通过Son构造函数new出来的实例的原型链.我想表达的是类的继承 实则是通过 Object.setPrototypeOf(B,A);Object.setPrototypeOf(B.prototype,A.prototype);来实现,这两个方法如果使用构造函数来实现的话是否可以通过上面两个构造函数来简单的实现,分别为构造函数B1继承构造函数A1,B1.prototype继承A1.prototype
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来实现寄生组合继承
《2. Object.setPrototypeOf(B.prototype,A.prototype); 结果为B.prototype.__proto__=A.prototype,依然存在直接修改原型链的问题》 关于这块问题,是否可以理解为对象之间只要存在继承关系,继承者和被继承者都可通过__proto__属性直接修改原型链??
登录后可查看更多问答,登录/注册
轻松驾驭 TypeScript 高级用法, 突破前端成长瓶颈
1.2k 15
924 12
1.1k 11
962 11
724 10