原型(prototype)这个词来自拉丁文的词proto,意谓“最初的”,意义是形式或模型。在JavaScript中,原型的探索也有很多有趣的地方,接下来跟随我的脚步去看看吧。

原型对象释义 每一个构造函数都有一个与之相关联的对象,该对象称之为原型对象。 每个实例对象都能共享其原型对象上的属性和方法。 原型对象的作用主要用来实现属性的继承,让实例对象能共享原型对象的属性,减少内存分配。 所以,在上一节中,我们想在每个Person对象中共享同一个say方法,可以这样来实现。

function Person(name, age) { this.name = name; this.age = age; }//在原型对象上添加say函数,实例对象共享该函数

Person.prototype.say = function(){ console.log("say hello"); };var p = new Person("zs", 10, say); p.say();var p2 = new Person("zs", 10, say); p2.say(); 在原型对象上添加成员的方法: ​ 构造函数.prototype.成员名 = 成员值; 为Person原型对象添加say方法后,实现了在多个实例对象上共享该方法的功能。

获取原型对象的方法: ​

构造函数.prototype ​ 实例对象.__ proto __ 在每个实例对象上都有一个__ proto 的属性,也是用来获取该对象的原型对象。 Person.prototype == p.proto __;//true

下图详细说明了各对象之间的关系:

面向对象中的核心概念 构造函数:Person,和new关键字一起创建对象 构造函数的原型对象:Person.prototype, 原型对象:和创建实例对象的构造函数相互关联的对象 实例对象:由构造器创建出来的对象称之为实例对象 实例化:由构造器创建实例对象的过程称之为实例化 对象的成员:属性+方法 实例成员:实例对象上的属性和方法,name,age,只能当前实例对象才能访问 原型成员:原型对象上的属性和方法,say(),使用该原型对象对应构造器创建出来的所有实例对象都能访问 静态成员:直接添加在构造函数上的属性和方法,只能使用构造函数才能访问 __ proto 属性介绍 该属性是在ES6之后才纳入规范,在这之前,只有部分浏览器实现。 该属性可以获取指定实例对象的原型对象,p.proto ,和Person.prototype获取的一样 我们也可以使用Object构造器上的getPrototypeOf(实例对象)方法获取指定实例对象的原型对象 以上提到的三种获取原型对象的方法所得到的结果是一样的。即: Object.getPrototypeOf(p) == Person.prototype == p.proto __ 扩展内置对象 内置对象是JS中事先定义好的对象,可以直接拿来使用的对象,在这类对象中已经封装好了一堆的方法和属性,方便开发者完成基本的功能。 但是在实际开发中,这些属性或者方法不一定能够满足我们的需求,此时就需要对这些内置对象做功能扩展。 需求:为数组对象添加一个获取元素个数的方法 var arr1 = [1, 2, 3];var arr2 = ["A", "B", "C","D"]; arr1.getLength = function () { return this.length; }console.log(arr1.getLength()); 上面为数组arr1添加了一个getLength()方法获取其元素个数,那么此时的arr2对象上有这个方法吗?相信大家心里都有答案。如果想要arr2拥有同样的功能,也需要同样的操作。 所以这种方式不可取,如果100个数组都想都需要这样的功能,操作起来就比较复杂了。 根据前面学过的知识点,我们完全可以使用原型来解决这个问题。 var arr1 = [1, 2, 3];var arr2 = ["A", "B", "C","D"];Array.prototype.getLength = function () { return this.length; }console.log(arr1.getLength());// 3console.log(arr2.getLength());// 4 我们直接在Array的原型对象上添加getLength()方法,之后创建的所有的数组对象都拥有了该方法,搞定! 这种方式能够解决我们的问题,但是还是存在问题的:

  1. 在多人开发的环境中,如果使用这种方式对内置对象做扩展,可能会对其他开发人员造成影响
  2. 如果在原型对象上添加了过多的成员,会降低对象成员的搜索效率。 安全的扩展内置对象 上面扩展内置对象的方法存在一定的问题,问题的关键其实在于我们是直接在内置对象的原型上进行拓展的,这样导致对其他使用该对象的开发人员造成影响。
  3. 所以,我们的解决思路就是,自定义一个对象,让该对象继承需要扩展的内置对象,然后只需要对自定的对象进行操作即可。
  4. function MyArray() { }//让MyArray的原型指向Array对象//即继承Array中的所有成员 MyArray.prototype= new Array(); MyArray.prototype.getLength=function () { return this.length; }var arr1 = new MyArray(); arr1.push("A","B","C","D","E");//内置对象的初始方法console.log(arr1.getLength());//扩展之后的方法
  5. 接下来,如果想要对数组做扩展,我们只需要操作MyArray即可,而不需要直接操作Array,如此,就不会对其他使用Array的开发人员操作影响了。看图理解:

原型链的结构图 每个实例对象都是由构造函数创建出来的 每一个构造函数都有默认关联的原型对象 原型对象本身也是对象,所以它也有自己的构造函数 原型对象的构造函数也有默认关联的原型对象 以上就构成了一种链式访问结构,称之为原型链 下面画出了Person对象和Array对象的原型链:

关于原型和原型链,为大家展示的差不多了。但是它的核心内容还远远不止这些。接下来还有很多内容需要大家继续探索,如果你对此感兴趣,那就关注我们,接下来会发布更多教程供大家参考。

十分钟读懂JavaScript原型和原型链的更多相关文章

  1. 3.十分钟读懂——App开发规范的业务流程

    转自:http://www.itdaan.com/blog/2017/12/08/6bc06b3387a8d1238504355a6a1c6743.html 一.主要流程   二.产品立项 工作概述: ...

  2. 一分钟读懂互联网广告竞价策略GFP+GSP+VCG

    原文:http://ju.outofmemory.cn/entry/116780 一分钟读懂互联网广告竞价策略GFP+GSP+VCG 两个广告位,三家广告主竞价,广告平台究竟应该制定广告竞价策略呢?这 ...

  3. 【转】一分钟读懂互联网广告竞价策略GFP+GSP+VCG

    参考这篇文章: http://ju.outofmemory.cn/entry/116780 一分钟读懂互联网广告竞价策略GFP+GSP+VCG 两个广告位,三家广告主竞价,广告平台究竟应该制定广告竞价 ...

  4. 一片非常有趣的文章 三分钟读懂TT猫分布式、微服务和集群之路

    原文http://www.cnblogs.com/smallSevens/p/7501932.html#3782600 三分钟读懂TT猫分布式.微服务和集群之路   针对新手入门的普及,有过大型网站技 ...

  5. 一分钟读懂低功耗蓝牙(BLE)连接数据包

    一分钟读懂低功耗蓝牙(BLE)连接数据包 1.概述 BLE 连接过程中有三个重要的数据包:SCAN_REQ, SCAN_RSP 和 CONNECT_REQ. SCAN_REQ: 扫描请求,由主设备(M ...

  6. 十分钟看懂AES加密

    十分钟看懂AES加密算法 今天看了Moserware的<A Stick Figure Guide to the Advanced Encryption Standard(AES)>收获了不 ...

  7. 一文读懂JS中的原型和原型链(图解)

    讲原型的时候,我们应该先要记住以下几个要点,这几个要点是理解原型的关键: 1.所有的引用类型(数组.函数.对象)可以自由扩展属性(除null以外). 2.所有的引用类型都有一个’_ _ proto_ ...

  8. 五分钟读懂UML类图

    平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道.实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧: 一.类的属性的表示方式 在UML类图中,类使用包含类 ...

  9. 五分钟读懂UML类图(转)

    平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道.实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧: 一.类的属性的表示方式 在UML类图中,类使用包含类 ...

随机推荐

  1. springboot 打包插件spring-boot-maven-plugin打包机制及内部结构分析

    今日思语:I miss you? 何解? 我错过你了?我想你了? 当下许多公司都会选择使用springboot作为服务应用开发框架,springboot框架提供了一套自己的打包机制,是通过spring ...

  2. File upload - MIME type

    Your goal is to hack this photo galery by uploading PHP code.Retrieve the validation password in the ...

  3. Likelihood function

    似然函数 统计学中,似然函数是一种关于统计模型参数的函数,表示模型参数中的似然性. 给定输出x时,关于参数θ的似然函数L(θ|x)(在数值上)等于给定参数θ后变量X的概率:L(θ|x)=P(X=x|θ ...

  4. rhce备战笔记

    1)配置selinuxvim /etc/slinux/config    SELINUX=enforcingsetenforce 1getenforce两台都做 2)配置SSHvim /etc/ssh ...

  5. vue基于页面中按钮权限控制

    main.js // 权限 /** 权限指令,对按钮权限的控制 **/ Vue.directive('allow', { bind: function(el, binding) { // 通过当前按钮 ...

  6. UFUN函数 UF_ATTR函数(UF_ATTR_read_value 函数用法)

    //此函数的功能是输入tag值,返回与属性标题对应的属性值 static string read_attr(tag_t object_tag) { UF_initialize(); ]="零 ...

  7. Linux 系统管理——进程和计划任务管理

    一.  程序和进程关系 1.程序 保存硬盘.光盘等介质中的可执行代码和数据 静态保存的代码 2.进程 在CPU及内存运行的程序代码 动态执行的代码 父.子进程:每一个进程可以创建一个或多个进程 二.静 ...

  8. GoCN每日新闻(2019-11-10)

    GoCN每日新闻(2019-11-10) 1. Go Netpoll I/O多路复用构建原生网络模型之源码深度解析 https://taohuawu.club/go-netpoll-io-multip ...

  9. eclipse右键空白、eclipse提示空白

    右键选择菜单经常显示空白.要试好多次才会出来.eclipse无法启动.启动报错 查看eclipse安装目录下的.metadata下的.log 里面会记录eclipse的报错信息 一般显示空白问题都是因 ...

  10. java集合代码示例

    一.List ArrayList 使用List时,最好初始化容量. ArrayList的默认容量为10,每次扩容增0.5倍,假如要放置100个元素,需要多次扩容. List<String> ...