介绍

每一个构造函数都有一个属性------即原型/原型对象prototype

原型对象是构造函数的一个属性

对象是构造函数创建出来的

每一个构造函数都有一个 prototype 属性,指向另一个对象这个对象的所有属性和方法,都会被构造函数的实例继承。 也就是说,我们可以把所有实例对象所要共享的属性和方法直接定义在prototype对象上

构造函数、实例、原型三者之间的关系

构造函数的 prototype 对象默认都有一个 constructor 属性指向 prototype 对象所在函数。(prototype是构造函数的属性

function F () {}
console.log(F.prototype) // => objectF.prototype.sayHi = function () {console.log('hi!')
}
var f1 = new F();console.log(f1.constructor === F) // => true
console.log(F.prototype.constructor === F) // => true

通过构造函数得到的实例对象内部会包含一个指向构造函数的 prototype 对象的指针 __proto__。(__proto__是对象的属性

对象.__proto__=== 构造函数.prototype

__proto__ 是非标准属性。 真正开发不使用的

实例对象可以直接访问原型对象成员。

总结:

  • 任何函数都具有一个 prototype 属性,该属性是一个对象

  • 构造函数的 prototype 对象默认都有一个 constructor 属性,指向 prototype 对象所在函数

  • 通过构造函数得到的实例对象内部会包含一个指向构造函数的 prototype 对象的指针 __proto__

  • 所有实例都直接或间接继承了原型对象的成员

原型链

图片引入:雅昕https://home.cnblogs.com/u/loveyaxin/

属性成员的搜索原则:

每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性

  • 搜索首先从对象实例本身开始

  • 如果在实例中找到了具有给定名字的属性,则返回该属性的值

  • 如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性

  • 如果在原型对象中找到了这个属性,则返回该属性的值

总结:

  • 先在自己身上找,找到即返回

  • 自己身上找不到,则沿着原型链向上查找,找到即返回

  • 如果一直到原型链的末端还没有找到,则返回 undefined

简单的原型语法:

每添加一个属性和方法就要敲一遍 Person.prototype 。 为减少不必要的输入,更常见的做法是用一个包含所有属性和方法的对象字面量来重写整个原型对象

function Person (name, age) {this.name = namethis.age = age
}Person.prototype = {type: 'human',sayHello: function () {console.log('我叫' + this.name + ',我今年' + this.age + '岁了')}
}

在该示例中,我们将 Person.prototype 重置到了一个新的对象。 这样做的好处就是为 Person.prototype 添加成员简单了.

但是也会带来一个问题,那就是原型对象丢失了 constructor 成员。

问题出现的原因 :是因为我们改变了构造函数的prototype

解决方法:保持constructor的指向正确

function Person (name, age) {this.name = namethis.age = age
}Person.prototype = {constructor: Person, // => 手动将 constructor 指向正确的构造函数type: 'human',sayHello: function () {console.log('我叫' + this.name + ',我今年' + this.age + '岁了')}
}

原型对象使用建议

  • 私有成员(一般就是非函数成员)放到构造函数中

  • 共享成员(一般就是函数)放到原型对象中

  • 如果重置了 prototype 记得修正 constructor 的指向

简单介绍JS构造函数中的原型相关推荐

  1. 简单介绍JS与JSP的区别

    参考了一些网上的资料,总结了一下 1.JSP全称是java server page    JS全称是javaScript 2.最主要的区别是运行位置不同. JSP运行在后台服务器上,混合在HTML中的 ...

  2. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  3. ⅰcp经济模型_简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  4. 简单介绍函数式编程中的Functor(函子),Applicative(加强版函子),Monad(单子)

    原文地址:http://skaka.me/blog/2015/12/19/functor-applicative-monad-scala-haskell/ 如果你是刚接触函数式编程,可能很容易被下面这 ...

  5. 简单介绍js中的confirm()方法的使用

    今天学习了js 中confirm的使用方法 confirm() 方法用于显示一个带有指定消息和 OK 及取消按钮的对话框. 如果用户点击确定按钮,则 confirm() 返回 true.如果点击取消按 ...

  6. DAX基础3:简单介绍Power BI中的New Quick Measures

    写基础比写分享麻烦很多.因为不知道要写到什么程度,写多了,信息量太大,接受困难,让人没有继续学下去的欲望.写少了,没啥干货,也不是我想要的.不忘初心,记住我是要干嘛的.哈哈哈,我是分享DAX的.其他的 ...

  7. ubuntu复制文件到另一个文件夹_简单介绍一下电脑中的文件或文件夹的复制、移动及删除的操作方式...

    大家好,我是波仔,今天又来跟各位学电脑基础的朋友们分享知识,让我们一起来学习吧. 复制文件或文件夹 在我们日常操作文件或文件夹的过程中,经常会遇到需要复制一些文件或文件夹什么的,下面我们就一起来分享一 ...

  8. 计算机窗口中如何移动文件,简单介绍一下电脑中的文件或文件夹的复制、移动及删除的操作方式...

    大家好,我是波仔,今天又来跟各位学电脑基础的朋友们分享知识,让我们一起来学习吧. 复制文件或文件夹 在我们日常操作文件或文件夹的过程中,经常会遇到需要复制一些文件或文件夹什么的,下面我们就一起来分享一 ...

  9. mysql 去掉日期.0_简单介绍MySQL数据库中日期中包含零值的问题

    下面小编就为大家带来一篇浅谈MySQL数据库中日期中包含零值的问题.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 默认情况下MySQL是可以接受在日期中插入0值,对于现 ...

最新文章

  1. 原创:MS Dynamics AX - XBRL 功能
  2. P1232 [NOI2013] 树的计数
  3. synchronized原理_synchronized 关键字底层原理
  4. php 表格分页代码,[Php]分页及表格样式
  5. 如何在隐藏视图时使用自动布局移动其他视图?
  6. go 中的关于命令行格式的使用
  7. [转]:vue-cli3.0配置详解
  8. Web Server与App Server
  9. 好用的mysql数据字典工具
  10. a3图纸标题栏尺寸标准,a3图纸(学生a3制图标题栏尺寸)
  11. 图书里的音频二维码如何实现呢?
  12. 什么是域名(Domain Name ) ?
  13. 定义一个描述学生通讯录的类AddressBook并输出
  14. 个人日记-《学习究竟是什么》读后感-2020/6/21
  15. android 取imei p10,华为p10如何解锁BootLoader 华为p10解锁BootLoader图文教程
  16. 从0开始学代码第五周!!!
  17. iphone摄像头发抖_为什么我的iPhone 7 Plus有两个摄像头?
  18. Neutron DHCP-Agent问题分析定位(2)
  19. 裁判文书数据-大数据分析用例
  20. Java IO学习日志

热门文章

  1. 智慧工厂之化工厂人员定位,化工厂区域视频联动管理-新导智能
  2. Pandas(八)--字符串函数
  3. Java常见的十种“运行时异常”
  4. BUUCTF basic BUU BURP COURSE 1 LFI Labs
  5. 白话文带你了解 封装 继承 多态
  6. jquery实现元素的隐藏、显示
  7. cannot undefine domain with nvram
  8. 用python控制手机电脑拍照自动发送邮箱
  9. 社会网络中社团发现及网络演化分析
  10. 移动端h5丶小程序自定义凹陷tabbar中间悬浮按钮思路分享