JS在设计之初 根本没有类的概念(现在也没有)为了实现实例对象的属性和方法的共享,就给function对象设计流一个prototype的概念,prototype是函数对象上面预设的对象属性。
简单的说 JS是基于原型的语言,当我们调用一个对象的属性时,如果该对象没有该属性,JS解释器就会从对象的原型对象上去找该属性,如果原型上也没有该属性,就去找原型的原型 直到最后返回null.这种属性查找的方式称为prototype chain.

在JS中 原型也是一个对象 通过原型可以实现对象的属性继承。JS对象都包含了一个[prototype]的内部属性,这个属性所对应的值就是该对象的原型。
[prototype]作为对象的内部属性 是不能被直接访问的。所以为了方便查看一个对象的原型,firefox和chrome中提供了"proto"这个非标准的访问器。

prototype
prototype是函数对象上面预设的对象属性
1. JS中所有的东西都是对象,每个对象都有prototype这个属性,这个属性是一个对象(object)
2. JS中所有的东西都由Object衍生而来, 即所有东西原型链的终点指向Object.prototype(就是说object是父类)
3. JS中构造函数和实例(对象)之间有微妙的关系,构造函数通过定义prototype来约定其实例的规格, 再通过 new 来构造出实例, 他们的作用就是生产对象。而构造函数(方法)本身又是方法(Function)的实例, 因此也可以查到它的__proto__(原型链)

看下面的代码:

var TestPrototype = function () { //定义了一个叫TestPrototype的函数对象(就像类一样)this.propA = 1; //定义了这个函数对象的属性:propAthis.methodA = function() { //定义了这个函数对象的方法:methodAreturn this.propA; //返回当前对象的propA属性}
}TestPrototype.prototype = { //定义这个函数对象的prototype属性 因为这个属性是预设的 所以不用提前声明methodB: function() { //在原型里面直接定义方法methodBreturn this.propA; }
}var objA = new TestPrototype(); // 新建一个TestPrototype实例objA.methodA() // 调用methodA
objA.methodB() // 调用methodB


尤其注意:
这个类:TestPrototype
这个类有两个方法 一个是我们自定义的 叫methodA, 另一个是预定义的:_proto_方法,如果我们继续在这个方法里面定义方法,那么自然而然这个方法也会自带一个_proto_方法。
我们要知道 Object.prototype的proto属性是个访问器属性 一个getter和setter函数 ,他可以公开访问它的对象的内部[prototype]不管这个是对象还是Null(原型链的顶端)

然后接下来的就看不懂了…搞不明白为什么objA和objB不一样…
总结:
说实话:还是没有完全搞懂 反而更乱了。请参见《用例子彻底理解JavaScript Prototype(原型)》
JS是基于原型的语言
想想我们是怎么创建新对象的:var obj = {}其实最终是通过var obj = new Object()创建的。是不是和上面的例子很像:通过new 构造函数 生成一个对象。
当我们创建一个对象后,就可以通过“点”方法名的方式调用一些并不是我们手写的方法了,如obj.toString()

其实我们调用的是Object.prototype.toString。现在是不是对 JavaScript 是基于原型的语言这句话有些理解了。
其实不止Object是这样的,Array、String、Number等都是这样的原理。
JS一切皆对象

是不是很神奇,居然全等。想想这是为什么?还记得上面说的原型链吗?

refer: https://zhuanlan.zhihu.com/p/35458229

JavaScript的prototype(原型)是什么?相关推荐

  1. JavaScript 面向对象 (prototype 原型模式)

    一. JavaScript 设计思想 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览 ...

  2. javascript之prototype原型属性案例

    练习: 给字符串对象添加一个toCharArray的方法,然后再添加一个reverse(翻转)的 方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  3. JavaScript中的原型(prototype)与继承

    在JavaScript中,原型是用来模仿其他「类」语言继承机制的基础.原型并不复杂,原型只是一个对象. 一.原型对象 1.1 什么是原型对象 每当我们创建了一个函数后,这个函数就拥有了一个protot ...

  4. 说一说JavaScript 中的原型ProtoType

    一时兴起,写一遍博客吧. "函数是函数,函数也是对象" 相信学过js 的同学看到这句话很熟悉.我表示耳朵都听出茧子了. 我们都知道,在JavaScript中是没有类的概念的,那么怎 ...

  5. javascript中的prototype原型、_proto_属性、原型链

    prototype原型 JavaScript是面向对象的语言,那么继承自然是其重要特征之一.与标准面向对象语言不同,JavaScript继承主要通过prototype原型实现.每一个函数都具有prot ...

  6. JavaScript -- 对象与原型链 [[Prototype]]

    一.第三章:对象 1.属性描述符(数据描述符) 可以使用 Object.getOwnPropertyDescriptor( myObject, "a" ); 获取myObject对 ...

  7. 关于JavaScript的Prototype及原型对象的理解

    学习JavaScript时,就一定会涉及到两个概念–prototype,原型对象.自己在做项目时可能无意中使用到,但是却没有真正去了解这个东西,在学会使用的基础上,进一步去理解它会帮助自己吸收到更多不 ...

  8. JavaScript 笔记 ( Prototype )

    这阵子实在好忙 ( 这样说好像也不是一两个月了... ),然后因为工作伙伴都是 JavaScript 神之等级的工程师,从中也学到不少知识,毕竟就是要和强者工作才会成长呀!为了想好好瞭解他们写的程式码 ...

  9. JavaScript为什么使用原型模式而不是类模式

    导言: 作为JavaScript初学者的本菜鸡而言,刚一开始接触这门语言我就被他的原型模式给吓到了.并且在相当长的一段时间之内,我都完全不能理解或者不能接受这个模式.直到最近经过多方调查和思考才有所明 ...

最新文章

  1. Apache + PHP为什么不能在www目录下写文件以及如何解决PHP写文件问题
  2. 阿里云消息队列 RocketMQ、Kafka 荣获金融级产品稳定性测评 “先进级” 认证
  3. hdu4099(斐波那契数+字典树)
  4. 计算机视觉与深度学习 | 激光雷达(Lidar)发展史及其应用
  5. ElasticJob corn定时表达式语法(亲测)
  6. Tcpdump(linux)下载、安装、使用说明
  7. 如何在Marketing Cloud里创建extension field扩展字
  8. 从头开始敲代码之《从BaseApplication/Activity开始》
  9. 纪中培训总结(2019年9月4~13日)
  10. 前端学习(982):jquery概述
  11. rocketmq java实战_RocketMQ实战与原理解析 杨开元著 PDF下载
  12. jQuery判断Dom对象是否存在
  13. 蒋方舟:到清华不再做名人 狂热崇拜理工男生
  14. sFlow-RT 3.0使用
  15. 网狐棋牌游戏平台服务器架构设计分析[转]
  16. golang对接支付宝支付
  17. 教你修改网卡物理地址(MAC)
  18. Linux账号与群组系统介绍
  19. DiskGenius 百度云下载链接
  20. 好气色“吃”出来 7条守则缔造美肌—多喝水、喝对水

热门文章

  1. Python爬虫入门笔记
  2. 毕业设计 单片机指纹识别系统 - 嵌入式
  3. Linux下Anaconda的安装及使用教程
  4. 让爱为生命护航——记岳阳职业技术学院信息工程学院爱心募捐活动
  5. C++课程设计--学生考试质量分析系统设计(MFC)
  6. 教你成为婚礼上最闪耀的明星
  7. idea cannot download sources解决办法
  8. java游戏解救人质_抖音解救人质的游戏
  9. python爬虫/ 获取多页信息并下载本地 P1-1
  10. ubuntu16.04 下怎么挂载iso文件