我的总结.
- 非函数的原型链继承使用__proto__, 函数的原型链继承使用prototype查找.
- prototype继承跟java的继承不同, 只会继承实例属性和方法.
- 想要继承父类的静态属性或方法, 可以将子类的原型指向父类的实例, 或者指向父类的原型复制. 但这里的缺点是, 要先修改指向, 再去更新属性方法.
function Father(name) {
this.name = name
}
Father.prototype.dance = function () {
console.log('I am dancing')
}
function Son(name, age) {
Father.call(this, name)
this.age = age
}
Son.prototype = Object.create(Father.prototype)
let son = new Son('小红', 100)
son.dance()
- 对于某些JavaScript内建对象(如Date),如果实例对象不是由它本身的构造函数生成的,不能访问其内部的属性和方法. 也就是说, 需要更绕的方法继承(颠倒父子类, 将子类的方法连接到父类实例上, 实现变相的继承)
- 用父类构造函数创建实例
- 将子类原型对象的__proto__指向父类的对象
- 将实例的__proto__属性指向子类的原型对象
function myDate(){}
let time = new Date()
myDate.prototype = (new Date())
myDate.prototype.log = function () { console.log('eee') }
time.__proto__ = myDate.prototype
time.log()
time.getTime()