【前端基础】JavaScript对象原型

每个实例对象都有一个私有属性__proto__,该属性指向它的构造函数的原型对象prototype。 该原型对象的__proto__也可以指向其他构造函数的prototype。
function Person(name) {
  this.name = name;

  this.setName = function(newName) {
    this.name = newName;
  };
}

Person.prototype.getName = function() {
  return this.name;
};

console.log(Person.prototype);
/**
 * 输出 { getName: ƒ, constructor: ƒ }
 */

console.log(Person.__proto__);
/**
 * 输出 { [native code] }
 */

const person = new Person('Tom');

console.log(person);
/**
 * 输出 Person { name: 'Tom', setName: ƒ }
 */

console.log(person.__proto__);
/**
 * 输出 Person { getName: ƒ, constructor: ƒ }
 */
function Man(name) {
  Person.call(this, name);

  this.isMale = true;
}

const man = new Man('LiLei');

console.log(man);
/**
 * Man { name: 'LiLei', isMale: true, setName: ƒ }
 */

console.log(man.getName?.());
/**
 * undefined
 */

console.log(man.__proto__);
/**
 * { constructor: ƒ }
 */
一个对象的__proto__指向它的构造函数的prototype。
Function.prototype.__proto__.constructor会指向Object。
最新的标准推荐使用Object.getPrototypeOf获取__proto__。