位置: 编程技术 - 正文

深入学习JavaScript中的原型prototype(java深入理解)

编辑:rootadmin

推荐整理分享深入学习JavaScript中的原型prototype(java深入理解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java learning,java learning,java deep learning,深入理解java nio,java深入书籍,深入学习习总书记系列讲话精神,深入学习习总书记系列讲话精神,深入学习习总书记系列讲话精神,内容如对您有帮助,希望把文章链接给更多的朋友!

javascript 是一种 prototype based programming 的语言, 而与我们通常的 class based programming 有很大 的区别,我列举重要的几点如下:

1.函数是first class object, 也就是说函数与对象具有相同的语言地位2.没有类,只有对象3.函数也是一种对象,所谓的函数对象4.对象是按 引用 来传递的那么这种 prototype based programming 的语言如何实现继承呢(OO的一大基本要素), 这也便是 prototype 的由来.

看下面的代码片断:

对于上面的代码,用浏览器运行后你会发现:

1.length: 提供的是函数的参数个数2.prototype: 是一个object3.其它三个都是function而对于任何一个函数的声明,它都将会具有上面所述的5个property(方法或者属性).

下面我们主要看下prototype.

从上面的示例中我们可以发现,对于prototype的方法或者属性,我们可以 动态地 增加, 而由其创建的 对象自动会 继承 相关的方法和属性.

另外,每个对象都有一个 constructor 属性,用于指向创建其的函数对象,如上例中的 fun.constructor 指向的 就是 Person.

那么一个疑问就自然产生了, 函数对象中自身声明的方法和属性与prototype声明的对象有什么差别&#;

有下面几个差别:

1.自身声明的方法和属性是 静态的, 也就是说你在声明后,试图再去增加新的方法或者修改已有的方法,并不会 对由其创建的对象产生影响, 也即 继承 失败2.而prototype可以动态地增加新的方法或者修改已有的方法, 从而是 动态的 ,一旦 父函数对象 声明了相关 的prototype属性,由其创建的对象会 自动继承 这些prototype的属性.继续上面的例子:

既然有函数对象本身的属性, 也有prototype的属性, 那么是由其创建的对象是如何搜索相应的属性的呢&#;

基本是按照下面的流程和顺序来进行.

1.先去搜索函数对象本身的属性,如果找到立即执行2.如果1没有找到,则会去搜索prototype属性,有2种结果,找到则直接执行,否则继续搜索 父对象 的 父对象 的prototype, 直至找到,或者到达 prototype chain 的结尾(结尾会是Object对象)上面也回答如果函数对象本身的属性与prototype属性相同(重名)时的解决方式, 函数本身的对象 优先 .

prototype 的典型示例

用过 jQuery 或者 Prototype 库的朋友可能知道,这些库中通常都会有 trim 这个方法。

示例:

深入学习JavaScript中的原型prototype(java深入理解)

trim 用法:

但是这样做又有一个缺点,因为比较新版本的浏览器中的 JavaScript 引擎在 String 对象中本身就提供了 trim 方法, 那么我们自己定义的 trim 就会覆写它自带的 trim。其实,我们在定义 trim 方法之前,可以做个简单的检测,看是否需要自己添加这个方法:

原型链

JavaScript 中定义或实例化任何一个对象的时候,它都会被附加一个名为 __proto__ 的隐藏属性,原型链正是依靠这个属性才得以形成。但是千万别直接访问 __proto__ 属性,因为有些浏览器并不支持直接访问它。另外 __proto__ 和 对象的 prototype 属性也不是一回事,它们各自有各自的用途。

怎么理解呢?其实,当我们创建 myObject 函数时,实际上是创建了一个 Function 类型的对象:

console.log(typeof myObject); // function

这里要说明一下,Function 是 JavaScript 中预定义的一个对象,所以它也有自己预定义的属性(如 length 和 arguments)和方法(如 call 和 apply),当然也有 __proto__,以此实现原型链。也就是说,JavaScript 引擎内可能有类似如下的代码片段:

事实上,JavaScript 引擎代码不可能这样简单,这里只是描述一下原型链是如何工作的。

我们定义了一个函数 myObject,它还有一个参数 name,但是并没有给它任何其它属性,例如 length 或者其它方法,如 call。那么下面这段代码为啥能正常执行呢?

这是因为我们定义 myObject 时,同时也给它定义了一个 __proto__ 属性,并赋值为 Function.prototype(参考前面的代码片段),所以我们能够像访问其它属性一样访问 myObject.length,即使我们并没有定义这个属性,因为它会顺着 __proto__ 原型链往上去找 length,最终在 Function 里面找到了。

那为什么找到的 length 属性的值是 1,而不是 0 呢,是什么时候给它赋值的呢?由于 myObject 是 Function 的一个实例:

当实例化一个对象的时候,对象的 __proto__ 属性会被赋值为其构造者的原型对象,在本示例中就是 Function,此时构造器回去计算参数的个数,改变 length 的值。

而当我们用 new 关键字创建一个新的实例时,新对象的 __proto__ 将会被赋值为 myObject.prototype,因为现在的构造函数为 myObject,而非 Function。

新对象除了能访问 Function.prototype 中继承下来的 call 和 apply 外,还能访问从 myObject 中继承下来的 getName 方法:

其实这相当于把原型对象当做一个蓝本,然后可以根据这个蓝本创建 N 个新的对象。

再看一个多重prototype链的例子:

上面这个示例的对象关系如下:

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_d3feabc1.jpg" alt="查看图片" />

JavaScript的面向对象编程基础 重新认识面向对象为了说明JavaScript是一门彻底的面向对象的语言,首先有必要从面向对象的概念着手,探讨一下面向对象中的几个概念:一切事物皆对象

理解和运用JavaScript的闭包机制 伟大的爱因斯坦同志说过:如果你无法向一个6岁小孩解释清楚某问题,那说明你自己都没整明白。然而,当我向一个岁的朋友解释什么是闭包时,却

再JavaScript的jQuery库中编写动画效果的指南 jquery中常用的动画的方法就是hide()与show().$(element).hide()这段代码可以与这相等element.css("display","none")在hide(time)与show(time)中填入事件,可以慢慢消失跟显

标签: java深入理解

本文链接地址:https://www.jiuchutong.com/biancheng/379050.html 转载请保留说明!

上一篇:JavaScript中的call方法和apply方法使用对比(JavaScript中的case)

下一篇:JavaScript的面向对象编程基础(js面向对象的几种方式)

  • 2023年享受六税两费减免吗
  • 增值税建筑服务税率变化时间
  • 一般纳税人收到普票可以抵扣吗
  • 个税抵扣未及时填报
  • 货代企业都需要交什么税
  • 个人所得税附加扣除中住房贷款利息扣除
  • 企业所得税纳税调整明细表
  • 固定资产停止使用转入更新改造的会计处理
  • 年化收益率和年利率的区别的例子
  • 装订凭证要如何写
  • 增值税发票抵扣勾选平台如何操作
  • 注册资本金印花税税率是多少
  • 属于资金的筹资方式是
  • 税控服务系统
  • 中途建账期初余额错误怎么纠正
  • 合并往来分录
  • 合同成本对应科目
  • 社保跨省转移社保流程
  • 怎么解决百度打不开页面
  • 给对方发短信显示imessage
  • 收到违反合同的违约金
  • 生物制品可以开箱验货吗
  • 生产经营所得投资者减除费用季度申报填吗
  • php中的类是什么
  • 发票章不清楚可以报销吗
  • linux从入门到什么搞笑
  • 所有者权益变动额怎么算
  • 核定企业应税收怎么算
  • win7无法记忆文件保存路径
  • 设备租赁费属于劳务吗
  • 会计科目的设置应该符合国家统一会计准则的规定
  • 开具增值税发票哪些情形不用交税?
  • 世界著名气泡酒公司
  • html+javascript
  • 税法折旧和会计折扣会计分录
  • 个税APP怎么填报扣税最少
  • 固定资产的核算内容包括
  • 研发人员具备的条件
  • 租赁收入会计分录怎么做
  • 总公司签合同开票分公司做业务分公司如何确认收入?
  • 分页存储过程是什么
  • 研发费用如何进账
  • 收到提供劳务的收入
  • 金融资产经营资产
  • 累计盈余定义
  • 劳务公司在异地施工要在哪里缴税
  • 普通发票的金额包含增值税吗
  • 小型微利企业认定标准2022年
  • 弥补以前年度亏损报表怎么填
  • 离职补偿金的计算基数
  • 滴滴电子普通发票能抵扣进项税吗
  • 缴纳社保公积金的会计分录
  • 销项100万进项80万交多少税
  • 固定资产税前一次性扣除会计处理与税务处理
  • 员工自己承担的社保费用进入管理费用吗
  • 新建厂房房产证办理流程
  • 联营企业子公司是否构成关联方
  • 支付给个人的劳务费需要发票吗
  • 无形资产的摊销方法
  • win7的系统在哪里打开
  • w10隐藏功能
  • Ubuntu开启热点
  • 应用商店如何更新软件
  • 远程桌面的文件怎么无法复制到本地桌面
  • windows8装.NET 3.5时出现0x800F0906错误解决方案
  • windows文件丢失怎么修复
  • Linux服务器架设指南百度网盘
  • jquery3.2.1
  • perl和shell的区别
  • 点击android
  • linux中的ls命令的功能是变换工作目录到目标指定目录
  • jquery选择器大全
  • [置顶]JM259194
  • jquery实例
  • 电子税务局可以开纸质发票吗
  • 国家税务12366电子税务局重庆
  • 电子税务局存款账户备案
  • 个体户开票怎么开步骤
  • 地税局上班时间是几点
  • 海口市哪个地方最漂亮
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设