面向对象的Jscript

ZynqMP双核通信避坑指南:Linux驱动+裸机固件协同开发实录 本文详细解析了Xilinx ZynqMP芯片中APU与RPU双核通信的技术实现,重点介绍了通过IPI中断实现Linux驱动与裸机固件协同开发的实战经验。内容涵盖硬件寄存器配置、Linux驱动开发、RPU裸机程序编写以及双核调试技巧,为开发者提供了一套完整的工程化解决方案,帮助规避常见开发陷阱。 阅读详情
面向对象的Jscript

  在web页面的客户端应用中,js已经成为不可缺少的部分。传统方式对js的应用完全基于过程模型,在这种模型里,普通语句及全局函数的使用最为普遍。当代码的数量逐渐增加,整个项目的维护就变得困难,逻辑也渐渐超出设计者的掌控,这个时候,我们需要借用软件工程的观念来管理项目。现代软件工程的根基是组件化、对象化的程序设计,由UML设计图指导的程序设计过程有条不紊地进行着。令人苦恼的是,当现代软件工程的理念渗入web项目的时候,却遇到了很大的问题,几乎没有办法发挥它的威力。

  问题的根源是什么?是我们没有一种有效的方式来组织js程序,使得它能够遵循一些基本的面向对象思想。然而,js并非没有办法体现出这些思想,本文试图用某些特殊的组织方式来让js符合基本的面向对象特性,为进一步应用软件工程的某些设计模式作铺垫。

  Jscript中内置了一些类,例如String、Array、Math等,用户可以直接从这些类实例化出对象,并使用其中的属性和方法。单凭这一点,不能说js符合面向对象语言的特征。一种面向对象的语言,应当具有封装,继承,多态等基本特性。Jscript并没有直接提供实现这些特性的方法,但是,也并非完全无法实现。

一、Js中的封装
  一种面向对象的语言应当允许用户创建自定义类型,这一点js做到了,只是它的自定义类型不是用class限定,而是作为function,这个function的作用相当于其他语言中的构造函数。在自定义类型中,用户可以添加属性、方法。但是,js中并未显式提供public、private、protected等访问限定,也没有提供static之类的作用域限定。下面通过几个例子,逐一说明创建自定义类型及实现各种限定的方法。

示例1-1:该例子演示了创建及使用包含属性和方法的自定义类型的过程。本例子中,我们创建了一个名为MyClass的类,其中包含了一个Name属性和一个showName方法,然后将这个类实例化,即可调用其中的方法,使用其中的属性。注意,在类中定义的方法和属性应当使用this关键字绑定到这个类,调用时使用绑定名字来访问,而不是通过实际名字。

 提示:您可以先修改部分代码再运行
示例1-2:该例子演示了public和private访问限定的实现。本例子中,我们修改了上个例子中的MyClass类,将其扩充为两个属性和两个方法。注意到PrivateName的声明,它并没有绑定到这个类,因此只具有局部作用域,生命期仅在本类中,如果在类的方法中调用它的话,是可以正常调用的(调用的时候不加this关键字)。同理,没有绑定的方法也只能在类的内部调用。因此,js中的public与private限定可以通过这种方式来实现。

 提示:您可以先修改部分代码再运行
  在这里,需要注意到一个现象,既然js把类本身作为一个构造函数,它在实例化的时候将逐个执行其中的语句,保留其中的方法定义,一直把整个函数执行完。因此,本例子中注释掉的writePrivateName();语句如果正常执行,将在MyClass类实例化的时候运行。

示例1-3:该例子演示了static限定的实现。本例子中,我们将MyClass类修改为带一个普通属性、一个静态属性和两个静态方法的类。这个类可以被实例化,所能够访问的仅仅是在类中定义的普通属性。当不实例化,通过类名访问的时候,可以访问类中的静态方法和静态属性,静态方法只能访问静态属性。与C++类似,静态成员的初始化需要在类的外面进行。

 提示:您可以先修改部分代码再运行
  通过以上三个示例,我们能够看出,js很好地支持了封装,并且支持了基本的访问限定。

二、Js中的继承
  继承是面向对象语言中扩展已有类型的一种有效途径,js没有提供用于实现继承的extends关键字或者“:”操作符,但是,由于它是一种动态语言,可以在需要的时候添加属性和方法。以下示例中继承机制的实现均基于这种原理。

示例2-1:该例子演示了从基类派生出一个子类的方法。子类中创建了基类的对象,为它添加了新的属性和方法,然后将它作为子类构造函数的结果返回出去,得到子类对象。子类对象比基类对象多了一些属性和方法,分配到了更多内存空间。注意到每次输出的constructor属性的值,发现它们两次返回的都是基类的构造函数,这并不奇怪,因为子类的构造函数最后返回的是添加了新属性、新方法的基类对象,js执行环境仍然会认为它是一个基类对象。

 提示:您可以先修改部分代码再运行
示例2-2:该例子演示了从两个不同基类派生出一个子类的方法。子类中分别创建了两个基类的对象,将其中一个的所有属性和方法添加到另外一个上,然后将后者作为子类构造函数的结果返回出去,得到子类对象。通过这种途径,变相地实现了多重继承。这里有一个注意点,不同的基类中如果包含同名变量或方法,需要自己指定以哪个作为实际绑定。

 提示:您可以先修改部分代码再运行
  通过以上两个示例能够看出,js其实支持了继承的机制,只不过这种机制需要更多的手工控制。

  既然提到继承,顺便讨论一下protected限定,它的作用是使得被限定的变量或方法不能被类的实例调用,但是能够被派生类调用。写这篇文章的时候本人曾经花了不少时间来考虑是否有可能使用js模拟出这种限定,后来发现,既然public跟private限定是通过指定绑定来实现的,那么,没法创建一种介于绑定和不绑定之间的关系,也就不好用这种方式模拟。再转念一想,protected限定几乎都是实现在编译型的语言中。在目标代码或者中间代码层次,这种限定非常重要,它能够有效配合软件工程理论进行开发,但是js是纯解释型语言,源代码公开的级别,不存在有效的模块保护机制,任何人可以随意修改代码,这样,protected关键字完全没有用武之地。

  C++等语言拥有一种特殊类:接口。接口的作用是为类提供规范、约束,它规定了继承这个接口所必须实现的方法集合。我们当然可以实现这样一个机制,当类继承接口的时候,检查它是否实现了接口中的全部方法,或者是否提供了这些方法的声明,但这种做法并不必要。当继承这个接口的时候,根据上面实现的这种继承机制,将会直接创建接口的一个对象(有的语言中禁止把接口实例化),这个时候,它已经包含了接口中所定义的方法集合,即使不重新定义这些方法并绑定,他们显然已经被声明了,而且,js不提供一个机制用于识别抽象方法,接口中的方法是否已被实现也无从得知。

三、Js中的多态
  多态能够让对象在运行时决定实际调用的方法体。由于js是一种动态语言,支持运行时绑定,讨论它的多态实际上并没有太大意义。Js不支持virtual关键字,而virtual关键字在现在的js里面也不会有明显用处。最根本的一点,js能够在运行时改变数据类型,可以随时根据新类型来取得它所拥有的方法,而忽视原有类型的影响。

示例3-1:该例子创建了一个基类跟一个子类,拥有一个同名方法,分别将基类和子类实例化并调用这个方法,显示的结果将随着方法所属类的不同而不同。原因很简单,因为例子使用的这种“继承”机制本身就是利用js语言的动态特性实现的,在一个类实例化的时候,它已经知道自己拥有哪些方法,而且,它也不关心这些方法从哪个类继承,只是将它们作为普通的成员方法来调用,所以,每一个类调用的同名方法都是属于自己的那个。再者,js是弱类型语言,它的变量声明的时候并不知道自己的类型,也并不知道将要被初始化成什么类型,赋予它什么类型的值,它就是什么类型的变量。本例子中分别注释掉的两段语句就说明了这个问题:Js在运行时既能够将子类变量赋给基类变量(这个特性在C++等语言中正是实现多态的关键),也可以将基类变量赋给子类变量(一般在静态语言中不允许,因为缺少附加信息)。

 提示:您可以先修改部分代码再运行
四、总结
  综合以上分析,js勉强能够算是一种面向对象的语言,因此,也可以将一些软件工程的思想应用到开发中,使得整个项目的架构稳定,逻辑清晰。51js论坛的万常华前辈作出了很大的努力,他将js的面向对象特性设计成一种规则,模仿java的包-类结构,做出了一些由这种规则支撑的常用类库,经过一段时间的努力和完善,已经可以初步进行应用了。

  附记:写这篇文章来源于一个灵感,在学习设计模式的时候,我联想到目前web程序设计中的诸多不规范情况,多数人依然使用传统的过程化结构来控制整个项目,当项目越做越大的时候常有力不从心的感觉。混乱的设计、到处隐藏的bug,这一切注定无法避免么?于是,我尝试用面向对象的思路来重新看待js,并期望以后能够在这个基础上,将一些设计模式应用到web程序设计上来,在界面设计与事务处理分离的前提下,让整个项目的架构趋于合理、稳定。写这篇文章的时候,我并不知道到底我对js了解了多少,也不知道我的理解是否包含了严重的错误,这一切只是一个探索,也希望大家能够赐教,或者给出好的建议。本人是东南大学计算机系大四的学生,碰巧的是,这学期软件体系结构课程老师要求自由选题写一篇论文,花了一个星期时间,希望没有让老师失望,呵呵。
 
HIC测序数据生信分析——第三节,HIC数据挂载 (取决于是否运行①prune模块,若①运行,则③运行;#HIC预处理后的比对文件Unknown_BM942-001H0001_1_val_1.Unknown_BM942-001H0001_2_val_2.hicup.bam 和contig基因组序列文件genome.fa。#HIC预处理后的比对文件Unknown_BM942-001H0001_1_val_1.Unknown_BM942-001H0001_2_val_2.hicup.bam 和contig基因组序列文件genome.fa。#这个方法简单一点。 阅读详情

相关推荐

cadence capture CIS 之添加数据库

2021-08-20 cadence capture CIS 之添加数据库准备一、添加数据源 准备 1、数据库文件(*.mdb) 2、电脑上安装好 cadence 软件 一、添加数据源 打开“ ODBC数据源管理器” ( 路径:C:\Windows\SysWOW64\odbcad32.exe ) ...

weixin_42256550的博客 6053

重新梳理JScript基础知识之对象篇

1.什么是对象? 对象(object):是一种数据类型,一种无序的数据集合,用来描述某一事物。 js中的数据类型分为两大类:基本数据类型和引用数据类型 基本数据类型有:数字型、字符串型、布尔型、undefined、null。 引入数据类型有:arr数组、function函数和object对象。 2.对象的使用 1.对象生声明的语法 let 对象名 = {} // 例如 let person = {} 2.对象是由属性和方法组成 属性是描述一些信息或者特征。 方法是描述行为或.

qq_46325260的博客 1264

PCIE配置和地址空间

来源:https://www.jianshu.com/p/574e9a2cbc4e 每个PCIe设备,有这么一段空间,Host软件可以读取它获得该设备的一些信息,也可以通过它来配置该设备,这段空间就叫做PCIe的配置空间。不同于每个设备的其它空间,PCIe设备的配置空间是协议规定好的,哪个地方放什么内容,都是有定义的。PCI或者PCI-X时代就有配置空间的概念,那时的配置空间如下: 图6.1 整个配置空间就是一系列寄存器的集合,其中Type 0是Endpoint的配置,Type 1是Brid.

qq_28643619的博客 4059

JavaScript 面向对象 读书笔记

理解对象 对象就是无序属性的集合, 其属性可以包含基本值, 对象或者函数。属性在创建时带有一些特征值(characteristic)。 属性类型 特性(attribute)描述属性(property)的各种特征,这些特性是为了实现JavaScript引擎用的,不能直接访问,放在[[ ]]中。 ECMAScript中有2种属性: 数据属性...

a1135784070的博客 403

【重启后nvidia-smi 命令出现错误】

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

qq_44769377的博客 5211

STM32 CAN发送丢包?3个邮箱轮询法实测有效(附代码)

本文深入分析了STM32 CAN总线发送丢包的根本原因,指出其内置CAN控制器的三个发送邮箱是硬件瓶颈。针对高负载场景,提供了实测有效的优化方案,重点介绍了非阻塞的邮箱状态轮询法,该方法通过主动轮询三个邮箱的空闲状态,充分利用硬件资源,显著提升发送稳定性并避免任务阻塞。文中附有可直接使用的示例代码。

weixin_29189381的博客 195

javascript 结构体示例

为什么80%的码农都做不了架构师?>>> ...

weixin_33788244的博客 5463

RISC-V嵌入式开发实战:手把手教你读懂并修改CH32V103的链接脚本(.ld)

本文深入解析RISC-V嵌入式开发中CH32V103链接脚本(.ld)的编写与优化技巧。从内存布局、段分配到实战调试,详细讲解如何解决程序跑飞、变量异常等典型问题,特别针对RISC-V架构的gp寄存器优化、中断向量表处理等特性提供专业指导,帮助开发者充分利用64KB Flash和20KB RAM资源。

weixin_33704234的博客 175

JScript中的prototype(原型)属性研究

我们知道JScript中对象的prototype属性,是用来返回对象类型原型的引用的。我们使用prototype属性提供对象的类的一组基本功能。并且对象的新实例会"继承"赋予该对象原型的操作。但是这个prototype到底是怎么实现和被管理的呢?    对于对象的prototype属性的说明,JScript手册上如是说:所有 JScript 内部对象都有只读的 prototype 属性。可以向其原

专栏 801

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

【ITS模型】基于MATLAB的ITS宽带短波信道模型的建模和仿真

1.软件版本 MATLAB2010b 2.本算法理论知识 对短波信道建模具有里程碑意义的是沃特森在1970年发表的一篇文章,文章中提出了一种静态模型,并在大气中进行了实验验证。 此静态模型可以描述为高斯散射增益抽头延迟线模型,即Watterson模型。 Watterson信道模型是经典的窄带短波信道模型,在这个模型中,信道衰落是瑞利幅度分布,而在每种传播模式中多普勒扩展的功率谱满足高斯分布。Watterson模型没有定义延时扩展的形状,认为各个多径传输模式中不存在延时扩展。其...

FPGA/MATLAB学习教程/源码/项目合作开发 2757

好文推荐(对JScript初,中级者有用):面向对象的Jscript[转贴]

面向对象的Jscript(http://bbs.blueidea.com/viewthread.php?tid=1822005&page=)面向对象的JavaScript编程(http://blog.youkuaiyun.com/liuruhong/archive/2004/05/19/1926.aspx)JSVM核心架构讲解以及部份代码分析(一)(二)http://www.blueidea.co...

溺水的鱼 - Later equals never. 87

ardupilot BMI088加速度陀螺仪学习

本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出

陌城烟雨 2053

翻译JScript中的面向对象系列文章

在今年的早些时候,那时我对Javascript还不是非常的了解。导致我在阅读各种JavaScript代码特别是ASP.NET AJAX时,有非常大的障碍和难度。后来,通过阅读《JavaScript The Definitive Guide, 4th Edition》的部分章节特别是Javascript核心部分的内容,让我对JavaScript的本质,动态性,面向对象能力第一次有了比较清晰的理解。再...

weixin_34191734的博客 81

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

面向对象的Jscript---转自经典论坛中桃花岛主的文章

面向对象的Jscript   在web页面的客户端应用中,js已经成为不可缺少的部分。传统方式对js的应用完全基于过程模型,在这种模型里,普通语句及全局函数的使用最为普遍。当代码的数量逐渐增加,整个项目的维护就变得困难,逻辑也渐渐超出设计者的掌控,这个时候,我们需要借用软件工程的观念来管理项目。现代软件工程的根基是组件化、对象化的程序设计,由UML设计图指导的程序设计过程有条不紊地进行着。令人苦恼...

weixin_34405925的博客 98

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

面向对象的Jscript(顶)

在web页面的客户端应用中,js已经成为不可缺少的部分。传统方式对js的应用完全基于过程模型,在这种模型里,普通语句及全局函数的使用最为普遍。当代码的数量逐渐增加,整个项目的维护就变得困难,逻辑也渐渐超出设计者的掌控,这个时候,我们需要借用软件工程的观念来管理项目。现代软件工程的根基是组件化、对象化的程序设计,由UML设计图指导的程序设计过程有条不紊地进行着。令人苦恼的是,当现代软件工程的理念渗入...

weixin_30681121的博客 84

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: 在ASP.NET中使用NHibernate
下一篇: 内容管理系统特征详解
SmartJavaer
博客等级 码龄21年 13粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值