JavaScript中的“面向对象”和Java语言中的“面向对象”有何不同?

JavaScript019

JavaScript中的“面向对象”和Java语言中的“面向对象”有何不同?,第1张

面向对象三大特征:封装、继承、多态

基于封装,引出了js如何创建对象(class、function、原型+闭包创建私有变量等)。这个java和js都差不多

基于继承,引出了js继承的一些知识点,如extends、super、重写重载、abstract(typescript)、interface(typescript)。js主要是基于原型继承,而java主要是基于extends

多态存在的三个必要条件。重写(继承)、重载、向上转型:其中重写,js支持。重载js不支持,可以通过额外处理来支持向上转型,因为js是弱类型语言,不支持数据类型,ts支持(编译阶段)

也就是说对于多态的支持,目前js只支持一种。

总的来说 js的面向对象支持还没有java语言那么丰富严谨,正是因为这些宽松语法,也让js变得更加有趣。但是面向对象oop的思想是一致的。因为oop思想不是固定语言的特性,而是一种思想。随着js不断的更新迭代,相信其语法特性也更加丰富和严谨。

后话:js目前的发展趋势,好像不在跟随传统语言的oop,有点往函数式编程的路上转向

JSOOPER商标总申请量1件

其中已成功注册0件,有0件正在申请中,无效注册0件,0件在售中。

经八戒知识产权统计,JSOOPER还可以注册以下商标分类:

第1类(化学制剂、肥料)

第2类(颜料油漆、染料、防腐制品)

第3类(日化用品、洗护、香料)

第4类(能源、燃料、油脂)

第5类(药品、卫生用品、营养品)

第6类(金属制品、金属建材、金属材料)

第7类(机械设备、马达、传动)

第8类(手动器具(小型)、餐具、冷兵器)

第9类(科学仪器、电子产品、安防设备)

第10类(医疗器械、医疗用品、成人用品)

第11类(照明洁具、冷热设备、消毒净化)

第12类(运输工具、运载工具零部件)

第13类(军火、烟火、个人防护喷雾)

第14类(珠宝、贵金属、钟表)

第15类(乐器、乐器辅助用品及配件)

第16类(纸品、办公用品、文具教具)

第17类(橡胶制品、绝缘隔热隔音材料)

第18类(箱包、皮革皮具、伞具)

第19类(非金属建筑材料)

第20类(家具、家具部件、软垫)

第21类(厨房器具、家用器皿、洗护用具)

第22类(绳缆、遮蓬、袋子)

第23类(纱、线、丝)

第24类(纺织品、床上用品、毛巾)

第26类(饰品、假发、纽扣拉链)

第27类(地毯、席垫、墙纸)

第28类(玩具、体育健身器材、钓具)

第29类(熟食、肉蛋奶、食用油)

第30类(面点、调味品、饮品)

第31类(生鲜、动植物、饲料种子)

第32类(啤酒、不含酒精的饮料)

第33类(酒、含酒精饮料)

第34类(烟草、烟具)

第35类(广告、商业管理、市场营销)

第36类(金融事务、不动产管理、典当担保)

第37类(建筑、室内装修、维修维护)

第38类(电信、通讯服务)

第39类(运输仓储、能源分配、旅行服务)

第40类(材料加工、印刷、污物处理)

第41类(教育培训、文体活动、娱乐服务)

第42类(研发质控、IT服务、建筑咨询)

第43类(餐饮住宿、养老托儿、动物食宿)

第44类(医疗、美容、园艺)

第45类(安保法律、婚礼家政、社会服务)

Object() Function() Array() 等等都为构造函数。

Js 面向对象与传统oop 有些不同,语法较高级 语法糖封装。

This 为指针。指向this作用域的调用者

1.原型继承链顶端为Object 。Js函数是对象

2.当读取对象中的属性时,先去实例本身中搜索,如搜索不到则去指向的原型中搜索

1.原型的存在意义在于实现继承共享,是在构造函数中定义的一个成员对象,在下次实例化时不需要在构造函数中定义成员 就可实现实例共享方法属性。

例子:通常为。构造函数.prototype.xxx=我想实现实例继承的东西 -》 new 构造函数 -》新实例a对象.原型指针指向构造函数的xxx对象(引用类型)

例子:Array 不等于 Array() 原因 Array为一个函数,而Array()为一个构造函数调用语句,故Array拥有prototype对象用于实例的共享继承,Array()产生一个实例 故只能拥有prototype对象的私有指针 proto

2.在使用原型继承时 不能使用字面量 构造函数.prototype={} 的方式重写原型对象 。因为会导致该原型对象的constructor属性被重写,在生成的实例中导致constructor指向Object并且会切断之前原型对象的联系,破坏原型链。

3.JavaScript 主要通过原型链实现继承。原型链的构建是通过将一个类型的实例赋值给另一个构造函数的原型实现的

例子:

xxx实例. proto -》function xxx()构造函数.prototype对象故xxx. proto === xxx.prototype

xxx.prototype. proto -》Object.prototype因为所有对象都为Object函数构造来的。故xxx.prototype. proto ===Object.prototype。

Object.prototype. proto 为原型链顶端 proto 定义了尚未使用所以为null故Object.prototype. proto ===null约定俗成。

instanceof 用来判断某实例是否为某构造函数的实例

isPrototypeOf 用于判断某实例是否拥有某构造函数的原型对象指针

1.原型模式有忽略构造函数定义初始值步骤及原型中操作引用类型的缺点。

所以需要组合使用 构造函数模式+原型模式 来创建实例。在构造函数中定义实例的属性,而需共享的方法就定义在原型对象中。

继承:在子构造函数中调用 父.call(this, name)实现构造函数之间的属性继承。使用 子.prototype = new 父()子.prototype.constructor = 子实现方法的继承。

2.如要在生产环境下的构造函数新增方法(如Array) 需要使用一个类似于工厂函数的寄生构造函数模式 在构造函数中返回一个修改后的对象