位置: 编程技术 - 正文

详解JavaScript基于面向对象之创建对象(2)(javascript的基础类型有哪些)

编辑:rootadmin

推荐整理分享详解JavaScript基于面向对象之创建对象(2)(javascript的基础类型有哪些),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript基础,javascript基础入门教程,js基础,javascript基于,js基础,javascript基础,javascript基础,javascript的基础类型,内容如对您有帮助,希望把文章链接给更多的朋友!

接着上文《详解JavaScript基于面向对象之创建对象(1)》继续学习。

4、原型方式 我们创建的每个函数都有一个通过prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。逻辑上可以这么理解:prototypt通过条用构造函数而创建的那个对象的原型对象。使用原型的好处就是可以让所有对象实例共享它所包含的属性和方法。也就是说,不必在构造函数中定义对象信息,而是直接将这些信息添加到原型中。 原型方式利用了对象的prototype 属性,可以把它看成创建新对象所依赖的原型。这里,首先用空构造函数来设置函数名。然后所有的属性和方法都被直接赋予prototype属性。我重写了前面的例子,代码如下:

详解JavaScript基于面向对象之创建对象(2)(javascript的基础类型有哪些)

在这段代码中,首先定义构造函数Car(),其中无任何代码。接下来的几行代码,通过给Car的 prototype 属性添加属性去定义Car对象的属性。调用new Car()时,原型的所有属性都被立即赋予要创建的对象,意味着所有Car实例存放的都是指向 showColor() 函数的指针。从语义上讲,所有属性看起来都属于一个对象,因此解决了前面的工厂方式和构造函数方式存在的问题。 此外,使用这种方式,还能用 instanceof 运算符检查给定变量指向的对象的类型: 原型方式看起来是个不错的解决方案。遗憾的是,它并不尽如人意。首先,这个构造函数没有参数。使用原型方式,不能通过给构造函数传递参数来初始化属性的值,因为Car1和Car2的color属性都等于 "blue",doors属性都等于4,mpg属性都等于。这意味着必须在对象创建后才能改变属性的默认值,这点很令人讨厌,但还没完。真正的问题出现在属性指向的是对象,而不是函数时。函数共享不会造成问题,但对象却很少被多个实例共享。请思考下面的例子:

上面的代码中,属性drivers是指向Array对象的指针,该数组中包含两个名"Mike"和 "John"。由于 drivers是引用值,Car的两个实例都指向同一个数组。这意味着给Car1.drivers添加值 "Bill",在 Car2.drivers 中也能看到。输出这两个指针中的任何一个,结果都是显示字符串 "Mike,John,Bill"。由于创建对象时有这么多问题,你一定会想,是否有种合理的创建对象的方法呢?答案是有,需要联合使用构造函数和原型方式。5、混合的构造函数/原型方式(推荐使用) 混合使用构造函数方式和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。结果是,所有函数都只创建一次,而每个对象都具有自己的对象属性实例。我们重写了前面的例子,代码如下:

现在就更像创建一般对象了。所有的非函数属性都在构造函数中创建,意味着又能够用构造函数的参数赋予属性默认值了。因为只创建showColor()函数的一个实例,所以没有内存浪费。此外,给Car1的drivers数组添加 "Bill" 值,不会影响到Car2的数组,所以输出这些数组的值时,Car1.drivers 显示的是 "Mike,John,Bill",而 Car2.drivers 显示的是 "Mike,John"。因为使用了原型方式,所以仍然能利用 instanceof运算符来判断对象的类型。 这种方式是ECMAScript采用的主要方式,它具有其他方式的特性,却没有他们的副作用。不过,有些开发者仍觉得这种方法不够完美。6、动态原型方式 对于习惯使用其他语言的开发者来说,使用混合的构造函数/原型方式感觉不那么和谐。毕竟,定义类时,大多数面向对象语言都对属性和方法进行了视觉上的封装。请考虑下面的 Java 类:

Java很好地打包了Car类的所有属性和方法,因此看见这段代码就知道它要实现什么功能,它定义了一个对象的信息。批评混合的构造函数/原型方式的人认为,在构造函数内部找属性,在其外部找方法的做法不合逻辑。因此,他们设计了动态原型方法,以提供更友好的编码风格。 动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置。下面是用动态原型方法重写的Car:

直到检查typeof Car._initialize是否等于"undefined"之前,这个构造函数都未发生变化。这行代码是动态原型方法中最重要的部分。如果这个值未定义,构造函数将用原型方式继续定义对象的方法,然后把 Car._initialized设置为true。如果这个值定义了(它的值为 true时,typeof 的值为Boolean),那么就不再创建该方法。简而言之,该方法使用标志(_initialized)来判断是否已给原型赋予了任何方法。该方法只创建并赋值一次,传统的 OOP开发者会高兴地发现,这段代码看起来更像其他语言中的类定义了。 我们应该采用哪种方式呢? 如前所述,目前使用最广泛的是混合的构造函数/原型方式。此外,动态原型方式也很流行,在功能上与构造函数/原型方式等价。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题。总之JS是基于面向对象的一门客户端脚本语言,我们在学习它的面向对象技术的时候要的留意JS与其他严谨性高的程序语言的不同。也要正确使用JS创建对象的合理的方式,推荐使用构造函数与原型方式的混合方式创建对象实例。这样可以避免许多不必要的麻烦。

标签: javascript的基础类型有哪些

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

上一篇:JS提交form表单实例分析(js怎么拿到表单提交数据)

下一篇:js表单提交和submit提交的区别实例分析(js中提交表单)

  • 微型企业政府补贴政策
  • 公积金做账需要计提吗怎么做
  • 员工冲借款收据怎么开?
  • 销售费用现金支付
  • 偿还不起债务大约能判多少年
  • 外聘人员需要扣个人所得税吗
  • 交通费汇算清缴怎么做账
  • 应交税费里的应交企业所得税意思是交了吗
  • 费用类发票怎么做账
  • 财务费用利息收入的账务处理
  • 公司租的员工宿舍退租,现在要开发票给人家退房租
  • 增值税开票流程图解
  • 企业所得税核定征收怎么计算
  • 应交税费明细科目有简易计税吗
  • 预交增值税扣税绑不了三方
  • 往年度的工资做什么科目
  • 非营利组织免税资格可以免些什么税
  • 收到运费怎么做账
  • 公司不盈利用交税吗
  • 零售金银首饰消费税税率是多少
  • 企业怎么通过债务转让
  • 附加税是按照应交增值税还是已交
  • 收到外运公司托收海运运费单据1000美元
  • 第三方工具查看对方关注抖音
  • ubuntu22.04更换RTX 4090显卡后,安装驱动和pytorch记录
  • 退回多收款项开具发票原发票需要退回吗
  • 出口零申报步骤
  • 固定资产一次性扣除后第二年账务处理
  • 年末一般纳税人税率表
  • 增值税发票与实际差异五毛钱
  • 非货币资金包括哪些科目
  • 固定资产清查盘盈盘亏的账务处理
  • 公司法人和股东哪个承担的责任大
  • thinkphp 模块
  • vue国际化解决方案
  • 划水划水划水表情包
  • javaweb:jquery中ajax的应用
  • 业务招待费进项转出报表怎么填
  • pandas模块的主要特点
  • java 代码简洁
  • 房产税和城镇土地使用税需要计提吗
  • 印花税实际缴纳时计入
  • 没有收据不开发票
  • 同一控制下企业合并
  • 暂估和开票的差异 erp处理
  • 固定资产当月入账当月计提吗
  • 公司为员工购买小汽车属于什么所得
  • 所得税汇算清缴报告在哪查
  • 注册工贸公司业务范围
  • 非关联企业之间可以借款吗
  • 工伤 保险赔付
  • 外包会计注意事项
  • 费用预算表怎么做
  • sql server数据库使用
  • centosgui
  • CentOS7 64位安装mysql图文教程
  • sqlsever修改数据
  • windows z
  • 让windows10蓝屏
  • win8老是自动安装软件
  • ubuntu 20.04 unity
  • win10mobile下载官网
  • xp远程连接win7
  • linux操作系统添加用户
  • centos挂载lvm硬盘
  • win10系统如何关闭杀毒软件和防火墙
  • linux安装virsh
  • linux安全工具
  • win8激活windows
  • celery使用
  • angularjs4
  • node.js 微信小程序
  • js实现简单排列的方法
  • js判断iframe是否加载完成
  • 安卓手机电驴
  • 国家税务局发票验证查询系统
  • 企业如何注册电子税务局账号
  • 河北省网上税务局电子税务局
  • 营转非的政策
  • 山西税务12366
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设