原型

JavaScript规定,每一个函数都有一个prototype对象属性,指向另一个对象。prototype对象属性的所有属性和方法都会被构造函数的实例继承。这意味着我们可以把那些公用的属性和方法,直接定义在prototype对象属性上。

prototype就是调用构造函数所创建的实例对象的原型(proto)。js在创建对象的时候,都有一个叫做proto的属性,用于指向它的函数对象的原型对象prototype。

prototype可以让所有的对象实例共享它包含的属性和方法。

原型链

每一个对象都可以有一个原型,这可原型还可以有它自己的原型,以此类推,就形成了原型链。

查找一个对象的属性或方法的时候,如果这个对象中没有这个属性或者方法,那就会在这个对象的原型对象中去找,以此类推,直到原型链结束。

_proto_

_proto_是原型链查询中实际用到的,指向构造函数的原型对象,他是对象独有的对象._proto_ = 构造函数.prototype

在js中,万物皆是对象,函数也是对象。所以构造函数也会有_proto_属性。

constructor

每个函数都有一个原型对象,该原型对象有一个constructor属性,指向创建对象的函数本身。

总结

1、只有函数才有prototype属性。

2、对象._proto_ = 构造函数.prototype

3、构造函数的prototype指向原型对象,原型对象的constructor指向构造函数。

使用

prototype最主要的用法就是将属性暴露成公用的。

function Person(name) {
this.name = name;
this.f = function() {
console.log("name is " + this.name)
}
} var wang = new Person("wang");
var li = new Person("li");
console.log(wang.name); //wang
console.log(li.name); //li
console.log(wang.f === li.f); //false

虽然wang和li都有f属性,但是实例对象访问的都是自己的私有属性。

使用prototype将f方法变成公共属性:

function Person(name) {
this.name = name;
}
Person.prototype.f = function() {
console.log("name is " + this.name)
} var wang = new Person("wang");
var li = new Person("li");
console.log(wang.name); //wang
console.log(li.name); //li
console.log(wang.f === li.f); //true

这就是prototype最大的作用:将属性或方法暴露为共有。

最新文章

  1. 转 : Hibernate懒加载深入分析
  2. C# xpath
  3. Swift编程语言简介
  4. easyui tree获取直接子节点而不获取孙子节点方法
  5. 【洛谷P1969】积木大赛
  6. 支持高并发的IIS Web服务器常用设置 II
  7. printf()函数
  8. CSS之页面添加标签
  9. JavaScript学习笔记(12)——JavaScript内置对象
  10. VS2015使用scanf报错解决方案
  11. JXOI 2017 简要题解
  12. 基于Token的身份认证 与 基于服务器的身份认证
  13. Confluence 6 服务器硬件要求指南
  14. BZOJ3251:树上三角形(乱搞)
  15. 火狐FireFox看视频不能全屏显示的问题
  16. struts2第三天——值栈
  17. Jquery ajax的参数格式化
  18. sql语句遇到错误: The used SELECT statements have a different number of columns :
  19. (数据科学学习手札33)基于Python的网络数据采集实战(1)
  20. MySQL中myisam和innodb的主键索引有什么区别?

热门文章

  1. Python高级特性——切片(Slice)
  2. C#通用查询器
  3. 数据结构学习--单循环链表(python)
  4. python部署mariadb主从架构
  5. LeetCode刷题191218
  6. enable SSL on weblogic
  7. Vue.js中 watch(深度监听)的最易懂的解释
  8. java之工厂方法设计模式
  9. vscode 格式化代码 与 eslint 有冲突的问题解决
  10. ASP.NET MVC5基础 – MVC文件架构