继承与原型链

Posted by Jianing on March 25, 2020

继承与原型链

__proto__ vs. prototype

__proto__和prototype来深入理解JS对象和原型链

  • 对象的__proto__属性的值就是它所对应的原型对象
  • 只有函数才有prototype属性
    • 创建函数时,JS会为这个函数自动添加prototype属性,默认值是一个有 constructor 属性的对象,不是空对象。
    • 调用构造函数时创建的实例的__proto__ 指向构造函数的prototype
  • Function.prototype.__proto__是标准的内置对象Object.prototype

原型链

1
Object.prototype.__proto__ === null;
  • Object.prototype是原型链的顶端

  • Object/Array/String等等构造函数本质上和Function一样,均继承于Function.prototype ,后者直接继承顶端Object.prototype

性能

  • 在原型链上查找属性比较耗时。
  • 试图访问不存在的属性时会遍历整个原型链。
  • Object.prototype 继承的 hasOwnProperty 是 JavaScript 中一个处理属性并且不会遍历原型链的方法。
  • 在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中。原因是这将导致每次构造器被调用时,方法都会被重新赋值一次(也就是,每个对象的创建)。
1
2
3
4
5
6
7
function MyObject(name, message) {
  this.name = name.toString();
  this.message = message.toString();
}
MyObject.prototype.getName = function() {
  return this.name;
};