JavaScript简介
通常,现代的Web可以划分为三大元素:CSS、HTML,当然还有JavaScript,这基本上可以说是一种模块化的思想:我们用CSS来使我们的页面对得起观众,我们用HTML让网页言之有物,而JavaScript让我们的页面看起来生动,也即功能的实现。这种JavaScript我们称之为不唐突的JavaScript。
JavaScript,顾名思义,是一种script language(脚本语言),当然,它和Java并没有一毛钱的关系,这个只是NetScape(网景)公司市场部的馊主意,为了提高这门语言的知名度,单相思地改为了JavaScript,但是我不明白,在JavaEye更名为ITEye之后,JavaScript为什么不更名为ITScript 。这个名字的一个后果就是很多刚入门学Java的同学在图书馆会拿上一本JavaScript的书,一不小心就误入歧途了(或许这正是市场部希望看到的)。好吧,回到JavaScript的定义上来,它是一门跨平台、基于原型的面向对象的脚本语言(什么是基于原型的面向对象语言等会解释),这也是JavaScript的一大优势。当然,很多书本和论坛都会强调JavaScript是一种弱类型的语言,也就是说变量可以在不声明的情况下使用,这是因为JavaScript不像Java那样需要通过编译才能运行,它是通过解释器解释后运行的,因此JavaScript也是解释性语言,它的变量会在解释器工作时进行数据类型检测。(莫非JavaScript的老爸才是李刚,这么嚣张,竟然可以不事先声明变量的类型,而且也不用更换名字)。JavaScript的合法定义或许应该这么说:JavaScript是一门弱类型、基于原型的面向对象的、解释性的脚本语言。它的语法和Java等语言类似,运行环境一般是web浏览器。
JavaScript中的对象
对象,相信接触过Java、C#等OOP语言的同志都明白,说来说去,就是由属性和方法组成的嘛。这里不展开讲我对对象的理解了,就JavaScript论JavaScript的对象吧还是。
我们一般将JavaScript中可操作的对象划分为两种:一种是JavaScript的核心对象(数组对象、日期时间对象等),另一种是JavaScript宿主环境定义的各种对象。或者,可以从广义上讲,JS中都是对象,管你function还是其它什么玩意,统统看成对象,这就是人们常说的万物皆是对象。
一般说来,JavaScript的核心对象(又称内置对象)有以下八种:
◎Array对象:用来表示数组的对象;
◎Boolean对象:用以支持布尔值;
◎Date对象:时间日期对象;
◎Math对象:用以支持一些常用的数学函数;
◎Function对象:函数支持对象;
◎String对象:字符串对象;
◎Number对象:提供对数字支持的对象;
◎RegExp对象:正则表达式对象;
以上八种核心对象,除了Math之外,其它七种JavaScript都提供了具有构造器功能的一个实例化机制(有些观点认为那就是构造器,因为可以通过它们new出这些对象,比如date = new Date(),但是我认为这只是具有构造器的功能而已,它们还是有区别的,最显而易见的区别就是我们可以date = new Date;这样来创建一个对象,此时,就不能说这是一个构造函数了)。当然,和大多数的语言一样,Math都是直接调用其中的方法的,这就不难理解了。
而用户自定义的对象就是通过定义一个函数来创建对象。这时,就得讨论function(函数)的对象化能力了(有一种观点认为在JS中,只有object和function才具有对象化的能力)。函数具有对象的特征,比如:
function dog(){
this.name = "Snoopy";
this.age = 5;
this.bark = function(){alert("Wow wow");}
}; // end dog
dog1 = new dog(); // 创建一个dog对象
从这个实例可以看出,这个函数dog具有属性和方法,是不是又可以对其进行实例化呢。此时,又有好事者指出,这个不就像Java中的构造器吗?好吧,如果你认为这样有利于记忆和理解的话。但是,需要记住的是,函数可以动态的为对象增加或删除属性和方法,这些属性可以是对象。
其实,我们根本没有必要纠结于一些名词,什么构造器、实例化机制啊,都只是一些表象,看到事物的本质才是关键,西藏有一个大喇嘛曾经说过:迷惑我们的不是事物本身,而是我们本身对事物的执着。也许,在看清了本质后就会发现,程序也不就是人类的思想+计算机的语言吗,那些C、C++、Java、C#、PHP等等各种计算机语言都是人类一种对计算机的抽象思维的具象表达。而且,过分地关注那些表面的东西很容易让我们变得浮躁从而无法接近事物的真相。
JavaScript中的对象表示方法
JavaScript中,常用的对象表示方法有两种,一种是比较熟悉的new,还有一个就是JSON。想必new一个对象大家伙是很在行的,比如在上面的例子中,我们就是通过new关键字来创建一个dog对象的。
这里着重讲另外一种很有用的对象表示法——JSON,其英语全称是JavaScript Object Notation,也即JavaScript对象表示法。JSON是一种轻量级的数据交换语言,是对象的一种序列化表示形式,简洁而明了,而JSON字符串是通过eval引擎转化为JS对象的。它的基本格式是:
var object = {
property1: pro1, // 属性1
property2: pro2, // 属性2
function1: fun1, // 函数1
function2: fun2 // 函数2
};
当然,我们还可以嵌套使用这种对象定义方式:
var object1 = {
property1: pro1,
function1: fun1,
object2: {property2: pro2, function2: fun2}; // 嵌套定义
};
这种JS对象声明方法相对来说比较易懂清晰。但是也有一个缺点:缺乏灵活性。这也算是JSON的美中不足之处吧。
JavaScript的面向对象特性
首先声明,我也是接触JavaScript才知道面向对象编程还分为两种:基于类的面向对象编程和基于原型的面向对象编程。像Java、C#这种属于基于类的面向对象语言,而JavaScript则属于基于原型的面向对象语言。
基于类的面向对象语言包括两个基本概念:类和实例。类是一个很抽象的概念,简单说是具有相同属性和近似功能的事物的一种归约。而实例就是类的一个特例,即类的一个具体对象。而在基于原型的面向对象语言中,只有一个概念,那就是对象,它还有一个很重要的概念——原型对象。
原型的概念需要重点强调。原型这个概念,相信大家接触过,以前学习语文课本中的小说时,经常会说主人公是以谁谁谁为原型的,小说的主人公B是以现实中A为原型,那么就说明B具有A的一些性格或经历。其实,从语义上,这两个原型是相通的,只是JavaScript原型得更彻底,JavaScript中,如果A是B的原型,那么B将具有A的所有属性和方法。JavaScript中的每一个对象都拥有一个原型对象作为参照对象,而且每一个函数有一个prototype属性,然后通过该属性引用原型对象。其实,原型对象就是一个对象模板。原型对象相对于类进行实例化具有一个很明显的优势——节省内存开销,我们知道,我们在用类实例化一个对象时,不管你用不用某个属性,它总是存在的,而当通过使用prototype,我们并不会在创建一个对象时将属性和方法附加在对象上,而是在对象调用某个属性或方法时,再去检测该对象是否具有所调用的属性或方法。
一般地,基于类的面向对象语言都具有三大特点:继承、封装以及多态。这些特征相信接触过Java或C++等面向对象语言的读者应该很清楚,不少人甚至将这些作为判断一种编程语言是否是面向对象语言的标准,但是这些仅仅是基于类的面向对象语言的特征而已,在JavaScript中,这三者只有继承独活于世了。没有类,怎么实现继承?我想,我们是时候突破类的限制了,n年前,我们的祖先的祖先类人猿正是因为突破了类的限制——直立行走,才让今天的我们可以淡定地取笑着敲代码的程序猿。没有类,我们还有原型不是吗?是的,我们就是通过原型链接来实现JavaScript中的继承的。先看看下面的代码吧:
// 定义一个Animal
function Animal(){
this.name= "";
this.age = "";
} // end Animal
// 定义一个Dog
function Dog(){
this.bark = "Wowwow";
} // end Dog
// 通过原型实现继承
Dog.prototype = new Animal();
// 创建一个Dog对象
var dog = new Dog();
// 打印dog对象具有的属性
for(var obj in dog){
document.write("属性:", obj);
} // end for
这段代码的运行结果是:
name
age
bark
Dog通过原型从Animal那里继承了Animal的两个属性,看看,这不也是继承吗?当然,方法也是可以继承的。这就是JavaScript的继承,相信理解了这个,也就不难明白为什么JavaScript也是面向对象语言了。
希望通过以上的阐述,大家已经对JS的面向对象特性以及JS的一些特点有了一些理解。理解了JS的一些基本真相,对于JS的深入学习相信也是大有裨益的。由于本人能力有限,文中难免会有疏漏之处,望大家不吝指正,在此先行谢过了。
分享到:
相关推荐
轴类零件加工工艺设计.zip
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
seaborn基本绘图人力资源数据集
移动机器人(sw三维)
自制html网页源代码查看器
3吨叉车的液压系统设计().zip
1_实验三 扰码、卷积编码及交织.ppt
北京交通大学软件学院自命题科目考试大纲.pdf
雅鲁藏布江流域 shp矢量数据 (范围+DEM).zip
基于RUST的数据结构代码示例,栈、队列、图等
NIFD:2024Q1房地产金融报告
详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/146916652
【工业机器视觉定位软件Vision-Detect】基于C#的WPF与Halcon开发的工业机器视觉定位软件(整套源码),开箱即用 有用户登录,图片加载,模板创建,通讯工具,抓边抓圆,良率统计,LOG日志,异常管理,九点标定和流程加载保存等模块,功能不是很完善,适合初学者参考学习。 资源介绍请查阅:https://blog.csdn.net/m0_37302966/article/details/146912206 更多视觉框架资源:https://blog.csdn.net/m0_37302966/article/details/146583453
内容概要:本文档详细介绍了Java虚拟机(JVM)的相关知识点,涵盖Java内存模型、垃圾回收机制及算法、垃圾收集器、内存分配策略、虚拟机类加载机制和JVM调优等内容。首先阐述了Java代码的编译和运行过程,以及JVM的基本组成部分及其运行流程。接着深入探讨了JVM的各个运行时数据区,如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区等的作用和特点。随后,文档详细解析了垃圾回收机制,包括GC的概念、工作原理、优点和缺点,并介绍了几种常见的垃圾回收算法。此外,文档还讲解了JVM的分代收集策略,新生代和老年代的区别,以及不同垃圾收集器的工作方式。最后,文档介绍了类加载机制、JVM调优的方法和工具,以及常用的JVM调优参数。 适合人群:具备一定Java编程基础的研发人员,尤其是希望深入了解JVM内部机制、优化程序性能的技术人员。 使用场景及目标:①帮助开发人员理解Java代码的编译和执行过程;②掌握JVM内存管理机制,包括内存分配、垃圾回收等;③熟悉类加载机制,了解类加载器的工作原理;④学会使用JVM调优工具,掌握常用调优参数,提升应用程序性能。 其他说明:本文档内容详尽,适合用作面试准备材料和技术学习资料,有助于提高开发人员对JVM的理解和应用能力。
Android项目原生java语言课程设计,包含LW+ppt
戴德梁行&中国房地产协会:2021亚洲房地产投资信托基金研究报告
Android项目原生java语言课程设计,包含LW+ppt
Thinkphp6.0+vue个人虚拟物品发卡网站源码 支持码支付对接 扫码自动发货 源码一共包含两个部分thinkphp6.0后端文件,以及vue前端文件.zip
《基于YOLOv8的食品冷链运输车厢门未锁闭预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。