原型总结

186 阅读1分钟

参考来源js面向对象详解

我的总结.

  1. 非函数的原型链继承使用__proto__, 函数的原型链继承使用prototype查找.
  2. prototype继承跟java的继承不同, 只会继承实例属性和方法.
  3. 想要继承父类的静态属性或方法, 可以将子类的原型指向父类的实例, 或者指向父类的原型复制. 但这里的缺点是, 要先修改指向, 再去更新属性方法.
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();
  1. 对于某些JavaScript内建对象(如Date),如果实例对象不是由它本身的构造函数生成的,不能访问其内部的属性和方法. 也就是说, 需要更绕的方法继承(颠倒父子类, 将子类的方法连接到父类实例上, 实现变相的继承)
    1. 用父类构造函数创建实例
    2. 将子类原型对象的__proto__指向父类的对象
    3. 将实例的__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();