位置: 编程技术 - 正文

关于JavaScript定义类和对象的几种方式(下列关于javascript的叙述正确的有)

编辑:rootadmin
可以看看这个例子:   大家第一眼看到这个例子觉得输出结果是什么?‘global'?还是‘local'?其实都不是,输出的是undefined,不用迷惑,我的题外话就是为了讲这个东西的。 其实很简单,看一看JavaScript运行机制就会明白。我们可以把这种现象看做“预声明”。但是如果稍微深究一下,会明白得更透彻。   这里其实涉及到对象属性绑定机制。因为所有JavaScript函数都是一个对象。在函数里声明的变量可以看做这个对象的“类似属性”。对象属性的绑定在语言里是有分“早绑定”和“晚绑定”之分的。   【早绑定】 是指在实例化对象之前定义其属性和方法。解析程序时可以提前转换为机器代码。通常的强类型语言如C++,java等,都是早绑定机制的。而JavaScript不是强类型语言。它使用的是“晚绑定”机制。   【晚绑定】 是指在程序运行前,无需检查对象类型,只要检查对象是否支持特性和方法即可。可以在绑定前对对象执行大量操作而不受任何惩罚。 上面代码出现的“预声明”现象,我们大可用“晚绑定”机制来解释。在函数的作用域中,所有变量都是“晚绑定”的。 即声明是顶级的。所以上面的代码和下面的一致: 在alert(a)之前只对a作了声明而没有赋值。所以结果可想而知。 <!-- 题外话到此结束 -->   RT:本文要说的是,在JavaScript里,我所知道的几种定义类和对象的方式:<! -- 声明:以下内容大部分来自《JavaScript高级程序设计》,只是个人叙述方式不同而已 -- >   【直接量方式】   使用直接量构建对象是最基础的方式,但也有很多弊端。 我们构建了一个对象Obj,它有一个属性name,一个方法showName。但是如果我们要再构建一个类似的对象呢?难道还要再重复一遍? NO!,我们可以用一个返回特定类型对象的工厂函数来实现。就像工厂一样,流水线的输出我们要的特定类型结果。   【工厂方式】 这种工厂函数很多人是不把他当做构建对象的一种形式的。一部分原因是语义:即它并不像使用了运算符new来构建的那么正规。还有一个更大的原因,是因为这个工厂每次产出一个对象都会创建一个新函数showName(),即每个对象拥有不同的版本,但实际上他们共享的是同一个函数。 有些人把showName在工厂函数外定义,然后通过属性指向该方法,可以避开这个问题: 可惜的是,这种方式让showName()这个函数看起来不像对象的一个方法。   【构造函数方式】 这种方式是为了解决上面工厂函数的第一个问题,即没有new运算符的问题。可是第二个问题它依然不能解决。我们来看看。 它的好处是不用在构造函数内新建一个对象了,因为new运算符执行的时候会自动创建一个对象,并且只有通过this才能访问这个对象。所以我们可以直接通过this来对这个对象进行赋值。而且不用再return,因为this指向默认为构造函数的返回值。 同时,用了new关键字来创建我们想要的对象是不是感觉更“正式”了。 可惜,它仍然不能解决会重复生成方法函数的问题,这个情况和工厂函数一样。   【原型方式】 这种方式对比以上方式,有个很大的优势,就是它解决了方法函数会被生成多次的问题。它利用了对象的prototype属性。我们依赖原型可以重写对象实例。 我们依赖原型对构造函数进行重写,无论是属性还是方法都是通过原型引用的方式给新建的对象,因此都只会被创建一次。可惜的是,这种方式存在两个致命的问题: 1。没办法在构建对象的时候就写入想要的属性,因为原型在构造函数作用域外边,没办法通过传递参数的方式在对象创建的时候就写入属性值。只能在对象创建完毕后对值进行重写。 2。致命问题在于当属性指向对象时,这个对象会被多个实例所共享。考虑下面的代码: 是的,当flag属性指向对象时,那么实例obj1和obj2都共享它,哪怕我们仅仅改变了obj1的flag属性,但是它的改变在实例obj2中任然可见。 面对这个问题,让我们不得不想是否应该把【构造函数方式】和【原型方式】结合起来,让他们互补。。。   【构造函数和原型混合方式】 我们让属性用构造函数方式创建,方法用原型方式创建即可: 这种方式有效地结合了原型和构造函数的优势,是目前用的最多,也是副作用最少的方式。 不过,有些追求完美的家伙还不满足,因为在视觉上还没达到他们的要求,因为通过原型来创建方法的过程在视觉上还是会让人觉得它不太像实例的方法(尤其对于传统OOP语言的开发者来说。) 所以,我们可以让原型活动起来,让他也加入到构造函数里面去,好让这个构造函数在视觉上更为统一。而这一系列的过程只需用一个判断即可完成。 如上,用_init作为一个标志来判断是否已经给原型创建了方法。如果是那么就不再执行。这样其实在本质上是没有任何变化的,方法仍是通过原型创建,唯一的区别在于这个构造函数看起来“江山统一”了。 但是这种动态原型的方式是有问题的,《JavaScript高级程序设计》里并没有深究。创建第一个对象的时候会因为prototype在对象实例化之前没来的及建起来,是根本无法访问的。所以第一个对象是无法访问原型方法的。同时这种方式在子类继承中也会有问题。 关于解决方案,我会在下一文中说明。 其实就使用方便来说的话,个人觉得是没必要做这个判断的。。。呵呵 ^_^

推荐整理分享关于JavaScript定义类和对象的几种方式(下列关于javascript的叙述正确的有),希望有所帮助,仅作参考,欢迎阅读内容。

关于JavaScript定义类和对象的几种方式(下列关于javascript的叙述正确的有)

文章相关热门搜索词:下列关于javascript的叙述正确的有,下列描述中,关于js函数定义方式,javascript定义,javascript的定义,下列关于javascript的叙述正确的有,javascript定义,关于javascript函数,下列关于javascript的叙述正确的有,内容如对您有帮助,希望把文章链接给更多的朋友!

学习面向对象之面向对象的基本概念:对象和其他基本要素 什么是对象对象是一件事,一个实体,一个名词,概括来说:万物皆是对象一个对象保存了某些信息,并知道如何执行某些操作对象的状态和行为对象

学习面向对象之面向对象的术语 面向对象的术语类类作为设计蓝图来创建对象的代码段,它描述了对象的特征;该对象具有什么样的属性,怎样使用对象完成一些任务,他对事件进行

JavaScript OOP面向对象介绍 OOP语言使我们有能力自定义对象和变量类型。面向对象编程JavaScript是面向对象的编程语言(OOP)。OOP语言使我们有能力定义自己的对象和变量类型。对象

标签: 下列关于javascript的叙述正确的有

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

上一篇:js创建对象的几种常用方式小结(推荐)(js创建对象的几种方式)

下一篇:学习面向对象之面向对象的基本概念:对象和其他基本要素(面向对象的基础知识)

  • 可供出售金融资产和长期股权投资
  • 建设工程劳务分包的规定
  • 申报美元出口以欧元收汇
  • 什么经营范围可以开电费发票
  • 出租的土地使用权是无形资产吗
  • 房地产怎么计算需要交多少税
  • 营业执照三证合一是哪一年开始的
  • 错账更正分录
  • 年底结账时利息收入怎么做处理?
  • 其他应收款属于流动资产吗
  • 上个月开的增值税发票这个月可以作废吗
  • 税务小规模定律是什么意思
  • 小型连锁药店需要报国税吗?
  • 印花税计提会计分录
  • 没有座机怎么填固定电话
  • 施工单位的项目
  • 科技型中小企业享受优惠税收政策2023
  • 新成立的公司季报
  • 企业生产总值怎么算出来的
  • 土地增值税清算后补缴税款如何帐务处理
  • 发票分割单可以抵扣吗
  • 免费样品销售给客户计入什么科目
  • 公司购买房子涉及什么税
  • 苹果11怎么充不上电了
  • 苹果电脑录屏的视频保存在哪里
  • linux怎么创建一个用户组
  • 银行存款的明细科目怎么写
  • 【安装 】
  • 怎么核算购进商品
  • 收到的税费返还减少说明什么
  • 美国大峡谷在哪儿
  • 弃置费用预计负债递延所得税怎么处理
  • 手把手教你用Excel制作考勤表
  • php中常量
  • elasticsearch基本概念
  • 库存盘点差异会计分录
  • phpvue开发模式
  • 纳税申报的流程如何?面试怎么说
  • sql server添加语句
  • 增值税进项税额转出的情况有哪些
  • 捐赠会计和税法上各怎么记录
  • 以前年度未结转
  • 分公司撤销跨区经营
  • 承租人转租房屋的后果
  • 补发工资怎么补发
  • 电费已支付未充值
  • 待抵扣进项税额是什么情况下用的
  • 研发一个月多少钱
  • 企业积分是什么意思
  • 财务软件可以直接做管理费用吗?
  • 个体工商户的公章丢了怎么办
  • 制造费用不结转成本 报表平吗
  • 如何设置生产成本总账表格
  • win10自带的音乐播放器groove如何设置
  • windows 10 周年更新
  • Linux配置防火墙端口
  • win7如何删除网络上的其它计算机
  • 苹果的mac怎么查
  • Centos 6.5 64位双网卡绑定教程
  • 安装 centos
  • win8.1中文版下载
  • win7电脑显示器颜色不正常怎么办
  • awtk linux
  • win7系统无法自动检测此网络的代理设置
  • mac装win8.1
  • linux zen3
  • popupwindow底部弹出
  • javascript对象的属性和方法
  • macos 升级python
  • unity打包64位出错
  • js 括号函数
  • 防止重复调用接口
  • 浏览器窗口上线怎么办
  • 人脸识别身份验证
  • 电子税务局房产税税源信息采集
  • 最多跑一次改革是谁提出来的
  • 20年灵活就业人员社保新标准
  • 辽宁地方税务局招聘
  • 全国初中应用物理知识竞赛获奖名单
  • 贵州省国家税务局电子税务局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设