位置: 编程技术 - 正文

javascript原型继承工作原理和实例详解(javascript中的原型和原型链)

编辑:rootadmin

推荐整理分享javascript原型继承工作原理和实例详解(javascript中的原型和原型链),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js原型继承的几种方式,js原型作用,javascript中的原型和原型链,js 原型继承的几种方法,js原型继承和构造继承,javascript原型继承,js 原型继承的几种方法,javascript原型继承,内容如对您有帮助,希望把文章链接给更多的朋友!

先为大家分享JS原型继承实例,供大家参考,具体内容如下

一、JS原型继承

二、JavaScript原型继承工作原理

JavaScript采用原型继承这事儿是众所皆知的,但由于它默认只提供了一个实现的实例,也就是 new 运算符,因此对于它的解释总是令人困惑,接下来阐明什么是原型继承以及在JavaScript中究竟如何使用原型继承。

原型继承的定义

当你阅读关于JS原型继承的解释时,你时常会看到以下这段文字:

当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止。——出自JavaScript秘密花园大多数JavaScript的实现用 __proto__ 属性来表示一个对象的原型链。在这篇文章里我们将看到 __proto__与 prototype 的区别何在。

注:__proto__ 是一个不应在你代码中出现的非正规的用法,这里仅仅用它来解释JavaScript原型继承的工作原理。

以下代码展示了JS引擎如何查找属性:

让我们举一个常见的例子:二维点,拥有二维坐标 x y ,同似拥有一个 print 方法。

用之前我们说过的原型继承的定义,我们创建一个对象 Point ,拥有三个属性:x,y 和 print 。为了能创建一个新的二维点,我们需要创建一个新的对象,让他其中的 __proto__ 属性指向 Point :

javascript原型继承工作原理和实例详解(javascript中的原型和原型链)

JavaScript怪异的原型继承

令人困惑的是,每个教授原型继承的人都不会给出这样一段代码,反而会给出下面这样的代码:

这和说好的不一样啊,这里 Point 变成了函数,然后还有个什么 prototype 的属性,而且有了 new 运算符。这他喵的是什么情况?

new 运算符是如何工作的

造物者 Brendan Eich 想让JS和传统的面向对象的编程语言差不太多,如Java和C++。在这些语言里,我们采用 new 运算符来给类实例化一个新的对象。所以他在JS里写了一个 new 运算符。

C++里有用来初始化实例属性的构造函数概念,因此 new 运算符必须针对函数。我们需要将对象的方法放到一个地方去,既然我们在用原型语言,我们就把它放到函数的原型属性中去。new 运算符接受一个函数 F 及其参数:new F(arguments...)。这一过程分为三步:

创建类的实例。这步是把一个空的对象的 __proto__ 属性设置为 F.prototype 。初始化实例。函数 F 被传入参数并调用,关键字 this 被设定为该实例。返回实例。现在我们知道了 new 是怎么工作的,我们可以用JS代码实现一下:

一个小小的例子来看一下他的工作状况:

JavaScript中真正的原型继承

JS的ECMA规范只允许我们采用 new 运算符来进行原型继承。但是大宗师 Douglas Crockford 却发现了一种可以利用 new 来实现真正的原型继承的方式!他写下了 Object.create 函数如下:

这看起来蛮奇怪的,但却是相当的简洁:它创建了新的对象,并将其原型设置为你想设置的任意值。如果我们允许使用 __proto__ ,那我们也可以这样写:

下面这段代码就是让我们的 Point 采用真正的原型继承:

结论

我们已经了解了JS原型继承是什么,以及JS如何用特定的方式来实现之。然而使用真正的原型继承(如 Object.create 以及 __proto__)还是存在以下缺点:

标准性差:__proto__ 不是一个标准用法,甚至是一个不赞成使用的用法。同时原生态的 Object.create 和道爷写的原版也不尽相同。优化性差: 不论是原生的还是自定义的 Object.create ,其性能都远没有 new 的优化程度高,前者要比后者慢高达倍。

标签: javascript中的原型和原型链

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

上一篇:分离与继承的思想实现图片上传后的预览功能:ImageUploadView(分离与继承的思想是什么)

下一篇:js类式继承与原型式继承详解(js类继承的几种方式)

  • 税务局防范税收风险的措施
  • 纳税属于什么会计科目
  • 已交税金是什么类
  • 在建工程是负数时应该怎么处理
  • 计提业务提成怎么做账
  • 进项税额留抵科目
  • 农行公户怎么给公户转账
  • 租金属于什么会计要素
  • 个体开建筑服务税率多少?
  • 企业购买的雇主责任险
  • 疫苗接种防疫站
  • 不征税收入的所得税处理
  • 专门从事研发的企业研发费用可以加计扣除吗
  • 部分销售退回怎么开票
  • 劳务公司民工工资可以抵进项吗
  • 30万的装修工程利润一般是多少
  • 年终奖个税公式表最新
  • 电子银行承兑汇票到期选择线上清算
  • 罚没收入要交税吗
  • 待处理财产损益期末结转到哪里
  • 归还法人前期垫付款项
  • 业务招待费是什么科目
  • configureandwatch
  • 替换重置的设备更新应考虑
  • 支付设备维修费用计入什么科目
  • 工商年报的纳税总额怎么查询
  • 免抵退税的账务处理
  • 公司出租房屋租金由承租方本人支付
  • 收到保险公司赔付的车辆维修费的会计分录
  • php poll
  • php数组函数面试题
  • 藏红花 (© Hayami Yanagisawa/Getty Images)
  • php修改sql语句
  • 冲回暂估分录
  • 取得剧本使用费怎么做账
  • php中imagecreatefromjpeg
  • 自有房子出租怎么做账
  • 个人所得税部分缴纳
  • 未分配利润可以弥补亏损吗
  • yolo 模型训练
  • php如何入门
  • 固定资产实收资本按照什么入账
  • 可行性研究合同印花税
  • 以前年度损益调整会计分录
  • Python中__slots__限制属性
  • 织梦发布文章栏目怎么不显示
  • 关联方利息支出税前扣除规定
  • 上传附报资料是哪些资料
  • 两处取得收入,如何进行个税的申报?
  • 委托加工物资的消费税
  • 企业其他应付款减少说明什么
  • 收取的招标资料费增值税税率
  • 购进消耗品怎么做账
  • 增值税一般纳税人认定标准
  • 增值税发票超过多久不能抵扣
  • 小规模开专票的税点是多少
  • 库存周转率中销量怎么算
  • 培训费产生的差额是什么
  • 固定资产应计入什么账户
  • 年终建账于年初建账,在录入期初余额时有什么不一样?
  • 并购成本计算公式
  • mysql “ Every derived table must have its own alias”出现错误解决办法
  • mysql使用入门教程视频
  • windowsxp不能启动怎么修复
  • win7系统屏幕键盘怎么打开
  • ·exe病毒
  • windows 10 mobile apk
  • 如何设置ie8
  • win7桌面图标有小方块
  • opengl context for format
  • 什么叫懒加载
  • node.js底层原理
  • 3种不同的播种方法
  • shell脚本中判断入参是否为空
  • python selectfrommodel
  • android 界面切换
  • 税收效应分析供求曲线
  • 淄博市税务局投诉电话
  • 开票税额超出1万怎么办
  • 北京市国家税务局发票查询平台
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设