prototype、getPrototypeOf、__proto__ 笔记

2 阅读1分钟

原型的三个访问器:prototypegetPrototypeOf__proto__

先来模拟创建一个存储用户数据User的类:

function User(name, passwordHash) {
  this.name = name;
  this.passwordHash = passwordHash;
}

User.prototype.toString = function() {
  return '[User ' + this.name + ']';
}

User.prototype.checkPassword = function(password) {
  return hash(password) === this.passwordHash;
}

这个User类的构造函数,接收两个参数,一个是用户名name,一个是密码的hash值,并且类中有两个方法toString以及checkPassword用来输出用户信息和检查密码;

var u = new User('Lix', '123456');

console.log(Object.getPrototypeOf(u)); // User { toString: [Function], checkPassword: [Function] }

console.log(u.__proto__); // User { toString: [Function], checkPassword: [Function] }

console.log(User.prototype); // User { toString: [Function], checkPassword: [Function] }
Object.getPrototypeOf(u) === User.prototype; // true
u.__proto__ === User.prototype; // true
  • C.prototype用于建立由 new C() 创建的对象的原型。
  • Object.getPrototype(obj)是ES5中用来获取obj对象的原型对象的标准方法。
  • obj.__proto__是获取obj对象的原型对象的非标准方法。

所以一般是不会直接访问C.prototype去获取原型对象的,在ES5的环境中,使用Object.getPrototype(obj)来获取原型对象,而在不支持ES5的环境中,可以考虑用__proto__这样的非标准方法来当做权宜之计。