原型链
学习ES5继承需要先理解javaScript的原型链
- 每一个对象都有__proto__属性 指向该对象的 原型对象
- 每一个函数(每个函数都是构造函数也是对象) 都有一个 prototype(对象原型) 属性 指向该函数的 原型对象
- 原型对象通过 constructor 属性指向该对象的构造函数
- 原型对象也是对象 也有__proto__属性 指向Object 的 原型对象
- Object 为顶级对象 object 的 __proto__属性 指向为null
以上为个人理解 欢迎指正
Object.getPrototypeOf() 获取原型对象的内置方法 __proto__属性为浏览器默认属性 在非浏览器环境下可能失效
ES5寄生组合式继承
// 定义父类(构造函数)
const Father = function (name, age, talk) {
this.name = name
this.age = age
this.talk = talk
this.speak = function () {
console.log('father Talk' + this.talk)
}
}
// 在父类原型上添加run方法
Father.prototype.run = function () {
console.log('father Run')
}
//定义子类
const Sun= function (like) {
//等于 把Father构造函数内容 写在子类里 但是父类原型上的内容 无效
// call 改变this指向并执行函数
// 静态属性已继承 实例属性未继承
Father.call(this, '父亲名字', '父亲年龄', '父亲说')
this.like = like
}
// 定义一个方法 继承父类原型上的属性
const extend = function (Z, F) {
// 这里本意是 将父类的原型对象 赋值给子类 直接'='赋值为引用类型 使用Object.create 创建新对象
Z.prototype = Object.create(F.prototype)
// 上一步修改了子类构造函数 再改回来(不能把根丢了)
Z.prototype.constructor = Z
}
extend(Sun, Father)
const classZ = new Sun('web')
const classF = new Father('name', 'age', 'talk')
console.log(classF)
console.log(classZ)
classZ.run() // 子类中调用父类的方法
classZ.speak()