理解prototype、getPrototypeOf和_proto_之间的不同

在学习JavaScript的过程中,原型是如何也绕不过去的一个知识点。虽然在现在ES6已经非常普及的现在,许多js的程序员都已经不再用原型的知识点来编写代码了,但是充分的理解原型也是很有必要的,尤其是在阅读他人优秀的js代码时,理解原型能帮助我们更好的理解早期代码。而原型包括三个访问器,这三个访问器有时功能重叠,所以准确的理解并区分他们还是很有必要的。

这三个访问器就是prototypegetPrototypeOf__proto__,从名字上可见这三个访问器都是对prototype这个单词做了一些变化,生成这样的属性方法名。为了测试这三个方法的输出,我们先来模拟创建一个存储用户数据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

既然这两个方法都跟我们User对象的原型相等,那么这三个属性的区别究竟是什么呢?别急,接下来就把结论告诉大家。

  • C.prototype用于建立由 new C() 创建的对象的原型。
  • Object.getPrototype(obj)是ES5中用来获取obj对象的原型对象的标准方法。
  • obj.__proto__是获取obj对象的原型对象的非标准方法。

所以一般我们是不会直接访问C.prototype去获取原型对象的,在ES5的环境中,我们使用Object.getPrototype(obj)来获取原型对象,而在不支持ES5的环境中,我们可以考虑用__proto__这样的非标准方法来当做权宜之计,希望各位不明白的同学能牢记这些区别。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,163评论 0 21
  • JavaScript面向对象程序设计 本文会碰到的知识点:原型、原型链、函数对象、普通对象、继承 读完本文,可以学...
    moyi_gg阅读 772评论 0 2
  • 一、objc_msgSend OC中的方法调用,其实都是转换为objc_msgSend函数的调用 objc_msg...
    紫荆秋雪_文阅读 270评论 0 0
  • 阿里在线上零售成为霸主之后,布局线下零售店成了马上要做的事情,阿里提出了新零售的概念,并迅速地开启了盒马鲜生超市的...
    微澜09阅读 325评论 0 0
  • 浑然不觉时间的流动。刚过转钟心中隐约就滋生出一种从未有过的情绪,忽惊,母亲节至,这一天世人看来是孩子反哺母爱之时,...
    汶原阅读 223评论 0 0