位置: 编程技术 - 正文

关于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创建对象的几种方式)

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

  • 纳税人资格是什么意思
  • 运输公司税率和税种
  • 出口免税收入的计税依据
  • 什么是调账的依据
  • 小规模企业所得税税率多少
  • 集团内部资产无偿划转是否纳税增值税
  • 安装服务费发票需要备注地址吗
  • 挂牌出售无形资产
  • 佣金的支付方式主要有什么
  • 贩卖增值税发票怎么判刑
  • 存在问题的具体表现和产生问题的原因分析
  • 应交税费贷方余额怎么算
  • 公司代扣代缴社保怎么操作
  • 工程施工合同如何核算收入成本?
  • 专利权转让的净收益计入
  • 固定资产计提折旧的方法
  • 社会保险基金管理局是干什么的
  • 办理完税务手续是否还需要报税?
  • 机器设备进项税额是否要分期抵扣
  • 普票记账联可以报销吗
  • 开采石头要交什么税
  • 员工旅游费需要缴纳个人所得税吗
  • 停车管理费收费依据
  • 汇算清缴截止
  • 现金流量表右边
  • 交易性金融资产和长期股权投资的区别
  • 超市预付卡发票如何入账
  • 天然气税费
  • 影响盈利能力的外部因素
  • 发票货物或应税劳务名称怎么修改
  • 鸿蒙系统智能设备怎么开启
  • 冲减以前年度营业外收入
  • php面向对象是什么意思
  • php odbc
  • 手相算命图解大全女
  • win7资源管理器叫什么
  • 集团公司对子公司如何进行资金管理
  • 搭建自己的php mvc框架
  • 前期认证相符
  • 海关缴款书能重开吗
  • mysql数据库连接方式
  • 购入交易性金融资产的相关税费计入
  • 认证发票抵扣有留抵税怎么做分录
  • 安装防伪税控系统的方法
  • 车辆处置缴纳增值税税率
  • 售后回租的实际利率怎么计算
  • 进项税额转出之后怎么处理
  • 商业企业的营业成本包括
  • 过路费油费计入什么费用
  • 可以抵扣进项税的项目包括
  • 接受捐赠收入如何计入收入
  • 其他应收怎么转收入
  • 出口退税过期怎么处理
  • 班车租赁服务
  • 案例如何分析
  • SQLServer CONVERT 函数测试结果
  • windows图标显示不出来
  • win7旗舰系统
  • 苹果mac安装字体怎么安装
  • PHP time_nanosleep() 函数使用介绍
  • 升级windows8
  • win10玩上古世纪闪退
  • windows10粘滞键
  • win7怎么无损升级到win10系统
  • 教你怎样用竹子搭棚子
  • js 高级技巧
  • excel 级联
  • Ext JS 4实现带week(星期)的日期选择控件(实战一)
  • cocos2dx3.0的label字体去描边
  • JavaScript的setter与getter方法
  • js frameset
  • vue两个花括号
  • android.net.wifi
  • jQuery插件是什么
  • android 获取手机屏幕截图
  • 基础的十进制按什么来算
  • 微信密码忘记了,手机号也没有用了,怎么办
  • 乡镇经管站是如何工作
  • 上海登高证查询官网入口
  • 不动产契税怎么计算出来的
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设