Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1879字,纯文字阅读大概需要3分钟。
内容图文
本系列作为 Effective JavaScript 的读书笔记。
prototype , getPropertyOf 和 __proto__ 是三个用来访问 prototype 的方法。它们的命名方式很类似因此很容易带来困惑。
它们的使用方式如下:
prototype:
一般用来为一个类型建立它的原型继承对象。比如 C.prototype = xxx ,这样就会让使用 new C() 得到的对象的原型对象为 xxx 。当然使用 obj.prototype 也能够得到 obj 的原型对象。
getPropertyOf:
Object.getPropertyOf(obj) 是 ES5 中用来得到 obj 对象的原型对象的标准方法。
__proto__:
obj.__proto__ 是一个非标准的用来得到 obj 对象的原型对象的方法。
为了充分了解获取原型的各种方式,以下是一个例子:
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; }; var u = new User("sfalken", "0ef33ae791068ec64b502d6cb0191387");
User 函数拥有一个默认的 prototype 属性,该属性的值是一个空对象。在以上的例子中,向 prototype 对象添加了两个方法,分别是 toString 和 checkPassword 。当调用 User 构造函数得到一个新的对象 u 时,它的原型对象会被自动赋值到 User.prototype 对象。即 u.prototype === User.prototype 会返回 true 。
User 函数, User.prototype ,对象 u 之间的关系可以表示如下:
上图中的箭头表示的是继承关系。当访问 u 对象的某些属性时,会首先尝试读取 u 对象上的属性,如果 u 对象上并没有这个属性,就会查找其原型对象。
比如当调用 u.checkPassword() 时,因为 checkPassword 定义在其原型对象上,所以在 u 对象上不会找到该属性,查找顺序是 u-> u.prototype 。
前面提到过, getPrototypeOf 方法是 ES5 中用来得到某个对象的原型对象的标准方法。因此:
Object.getPrototypeOf(u) === User.prototype; // true
在一些环境中,同时提供了一个非标准的 __proto__ 属性用来得到某个对象的原型对象。当环境不提供 ES5 的标准方法 getPrototypeOf 方法时,可以暂时使用该属性作为替代。可以使用下面的代码测试环境中是否支持 __proto__ :
u.__proto__ === User.prototype; // true
所以在 JavaScript 中,类的概念是由构造函数和其原型对象共同完成的。构造函数中负责构造每个对象特有的属性,比如上述例子中的 name 和 password 属性。而其原型对象中负责存放所有对象共有的属性,比如上述例子中的 checkPassword 和 toString 方法。就像下面这张图表示的那样:
总结:
- 使用 C.prototype 来决定 new C() 得到的对象的原型对象。
- Object.getPrototypeOf(obj) 方法是 ES5 中提供的用于得到某个对象的原型对象的标准方法。
- obj.__proto__ 是获取某个对象的原型对象的非标准方法。
- 在 JavaScript 中,类的概念是由构造函数和其原型对象共同定义的。
原文:http://blog.csdn.net/dm_vincent/article/details/39638743
内容总结
以上是互联网集市为您收集整理的Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同全部内容,希望文章能够帮你解决Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。