JavaScript 中只有对象,没有类。

实际上,JavaScript 才是真正应该被称为「面向对象」的语言,因为它是少有的可以不通过类,直接创建对象的语言。

函数的 prototype 属性

在 JavaScript 中,之所以会有「类」的错觉,是因为函数默认都会有一个名为 prototype 的公有并且不可枚举的属性,这个属性会指向另一个对象:

function Foo() {}

Foo.prototype; // {}

Foo.prototype 所指向的对象通常被称为 Foo 的原型

我们来看下代码:

function Foo() {}

var a = new Foo();

Object.getPrototypeOf(a) === Foo.prototype; // true

调用 new Foo() 时会创建一个新对象 a,其中的一步就是将新对象 a 内部的 [[Prototype]] 链接(关联)到 Foo.prototype 所指向的对象。

Object.create(..) 方法

生成一个关联到其它对象的新对象,可以使用 Object.create(..) 方法。看下面的例子:

var anotherObj = {
a: 2
}; // 创建一个关联到 anotherObj 的对象
var myObj = Object.create(anotherObj); myObj.a; // 2

现在 myObj 对象的 [[Prototype]] 关联到了 anotherObj。显然 myObj.a 并不存在,仅是尽管如此,属性访问仍然成功地(在 anotherObj 中)找到值 2。

如果在 anotherObj 也找不到 a 并且 anotherObj [[Prototype]] 链不为空的话,就会继续查找下去……这个过程会持续到找到匹配的属性名为止,要不然一直查找到 [[Prototype]] 链顶端的 Object.prototype 对象,还找不到就返回 undefined 了。

最新文章

  1. HubbleDotNet 的注册码生成器
  2. Runtime消息传送
  3. 微信公众号内H5调用微信支付国内服务商模式
  4. Pictures of Ascii Art
  5. 004--VS C++ 绘制封闭图形
  6. Sql中判断“数据库"、"表"、"临时表"、"存储过程"和列”是否存在
  7. web框架之Spring-MVC环境搭建
  8. [转] Putty - 文件夹显示的蓝色太暗
  9. 【Java】对服务器程序的理解
  10. hasClass方法 动画方法说明
  11. hdoj 1269 迷宫城堡(强连通分量)
  12. JavaScript面向对象编程(9)高速构建继承关系之整合原型链
  13. Python 项目实践一(外星人入侵小游戏)第三篇
  14. linux下的打包与压缩
  15. Python爬虫入门教程 64-100 反爬教科书级别的网站-汽车之家,字体反爬之二
  16. es crul查询(一)
  17. [原创] 详解云计算网络底层技术——虚拟网络设备 tap/tun 原理解析
  18. webstorm的快捷键总结
  19. 【java多线程】队列系统之DelayQueue源码
  20. 【强化学习】python 实现 saras 例一

热门文章

  1. envoy  功能介绍
  2. 企业建站系统MiinCMP1.0.5 版公布!
  3. 利用 Excel 写 C51 的宏定义
  4. (转)Download interrupted: Connection to https://dl-ssl.google.com refused
  5. 运行maven打出来的jar包报错:Unable to locate Spring NamespaceHandler for XML schema namespace
  6. CRC码计算
  7. linux启动自动挂载分区和/etc/fstab简单修复
  8. (转)winform pictureBox后台显示图片
  9. oracle数据库查询题目!!!!!我的最爱
  10. keytool生成JKS证书的详细步骤及截图