JavaScript必知的特性(继承)
多数人在学习JavaScript的时候。都是做Web的时候。须要表单验证。或者是一些简单的DOM操作,如同我上篇所讲。处在一个“辅助”的地位。
处在“辅助”地位的JavaScript,我们总是抱着解决这个问题即可的态度,自然不会关注其过多的特性。那么。今天我们就来聊聊在开发中有哪些特性是我们必需要了解的。
JavaScript的结构
JavaScript分为三个部分
ECMAScript JavaScript本身的语法
DOM 全称Document Object Model 。针对HTML Document操作的API,比如document.getElementByID
BOM 全称Browser Object Model,针对浏览器Window操作的API,比如window.location
在一般的项目中。多数人会关注DOM操作,所以忽略了JavaScript语法本身的精髓。我们今天重点关注的就是:JavaScript本身语法。
请注意:我们在前端使用JavaScript时,多数是以操作DOM为目的,学习JavaScript语言的精髓,本身就是为了让我们更优雅的“操作DOM”!
因为JS的每个特性都包括太多内容,所以我们仅仅能分多篇来讲。今日我们先讲继承!
我对于继承的解说方法会和百度的帖子迥异,但更通俗一些。希望大家看过之后能够秒懂“继承”。
面向对象的三大原则:封装,继承,多态。我们不能脱离其它法则单讲继承,封装是继承的先决条件。多态是继承要达到的目的,三者是纠合在一起的!
1. 封装
封装是对象的表现形式。
比方Java中,封装的表现形式是JavaBean,在JavaScript就是Object,通俗点就是{}
我们来看JavaScript的一个简单对象
对象的两个要点:属性和行为, name作为属性,work作为行为,已经满足封装的基本要素,所以我们认定student是一个对象。它的对象就是如此简单。
我们这里多插一个知识点:对象和我们平时讲的JSON,有什么不同呢?
JSON是JavaScript对象标记语言。JSON的作用是传输数据。“数据”具有不可变性。所以JSON仅仅能包括属性。不能有行为。
即:JSON中没有不论什么JavaScript方法!它们的差别就在于有没有包括方法。
要记住JSON和对象的差别,仅仅要我们记住一句绕口令就可以:JSON一定是JavaScript对象。JavaScript对象不一定是JSON!
2. 继承
全部的JavaScript的对象,在其生成的时候,编译器都会附加给对象一个特殊的属性:prototype,即大家常说的原型。理解原型是理解JavaScript继承的重点。
原型有一个最最最重要的特点: 强单例 。同一类型的对象拥有的原型是一个,比方Array。全部的Array实例的原型仅仅有一个。
以下的代码中。arr1和arr2的prototype指向的是同一个,假设设置arr1的为null,arr2的也就为null了。
wx_fmt=png" alt="" style="margin:0px; padding:0px; max-width:100%; height:auto!important">
我们在看JavaScript的API时,常常看到Array的方法有:push shift slice splice等等,这些方法都是存在Array的prototype中。
我们再来看看,当我们调用一个JavaScript对象方法的时候。它的解析器是怎样工作的?
比如调用arr1.push 方法,
1. 解析器会首先遍历“对象本身”的方法。假设找到。则直接调用,否则,继续第二步骤
2. 解析器会查看对象的Prototype对象中是否存在该方法,存在则调用。不存在就抛出Exception
说到这里。大家应该秒懂“Prototype”是个什么东西了吧。 事实上就是给对象附加一个内部对象而已,这个内部对象又是一个单例的。作为单例,相对于对象本身肯定高效率的! 可是也是危急的!。
比方刚才我贱贱的设置arr1的prototype为null,那完蛋了!
。整个页面的Array都要出错。假设我这样改动。预计有些不明所以的程序猿都要哭了,尼玛浏览器会骂人!
看过以上,请大家记住:每一个JavaScript对象都分为两个部分:“本身”和prototype。那么对象的继承也是针对这两个部分展开的。继承的目的是为了扩展。说更通俗点就是,为了给某个对象附加很多其它的方法。
这时候问题就回归为,怎样给JavaScrit对象附加方法?
针对本身附加
上面的student,这时候又来了小明同学,可是小明同学比Aric多了一项技能,会撸呀撸! 要怎样实现呢?
wx_fmt=png" alt="" style="margin:0px; padding:0px; max-width:100%; height:auto!important">
jquery的extend的原理就是把一个对象的全部属性和方法附加到另外一个上面。
针对prototype附加
假设上面代码改动为:小明.prototype.lol = func...这样也实现了相同的功能。可是这时候Aric也有了LOL这个功能。
百度上多数讲继承的帖子。都会有例如以下这种伪代码。 我们看过以上文章。是不是就明确了为什么! 我以前看过无数的继承的帖子,一直也不懂prototype是个什么玩意!
!
关于继承的使用,这里基本落幕,大家心中都应该有一个初步的印象了。
当你懂的事物的原理后。再学习起来应该就更加得心应手了。
3. 多态
面向对象的三大原则之中的一个:多态。多态分为对象多态和方法多态!
这是两个不同的概念。
对象多态
就是我们时常看到的猫狗都属于动物。猫叫是喵喵。狗却是汪汪,这是多态的最直接体现。至于很多其它实现细节,请大家自行百度。
方法多态
方法多态,就是方法名字同样,可是传入的參数列表不同。这个在Java或者C#中都被我们玩烂了! 在JavaScript中因为没有參数列表,一般都用方法的内部函数Arguments来表述!Arguments是伪Array。里面放的就是当前方法的參数列表!
详细使用过程中,就可以通过Arguments中元素的个数来实现方法多态。
非常多人都说JavaScript不是面向对象的编程语言。事实上是对JavaScript的误解。面向对象的三大原则,JavaScript都能实现!仅仅是实现的方式有些不同,却有异曲同工之妙。
wx_fmt=png" alt="" style="margin:0px; padding:0px; max-width:100%; height:auto!important">
说在最后的话:
JavaScript的继承不像Java那样有明白的语法规则。它是灵活多变的。所以写惯Java这样的类型的人员。很讨厌其语法。我在刚入门时,也是如此。可是在当你掌握了它,它的灵活多变会变成编程中的利器。剑之所指,所向披靡!
希望每一位有心学习JavaScript的程序猿,都能理解其继承原理!
接下来,我们会继续解说JavaScript的其它特性!在解说这些特性的同一时候。我会结合其一些知名类库,比方jQuery,解说这些特性在当中的应用。
wxfmt=jpeg" alt="" style="margin:0px; padding:0px; max-width:100%; height:auto!important">
JavaScript必知的特性(继承)的更多相关文章
- javaScript 工作必知(七) 对象继承
对象继承inherit var o = { r: 1 }; var c = function f() { }; c.prototype = o; c.r = 3; alert(o.r);//被继承的属 ...
- JavaScript全讲-必知的特性
上篇讲完JS面向对象的特性,我们今天就来聊聊它的其它特性. JS面向对象的特性较为隐晦,真正使用也是比較少的.而今天我们要讲的,却是在实际开发中常常遇到的特性. 1. 函数式编程 多数人并不知道&qu ...
- javascript必知必会:面象对象编程
面象对象编程技术的核心理念:封装.继承.多态:在一些主流的高级编程语言中,比如:C#,VB.NET,JAVA,PHP等都是很容易实现的,而如果要在javascript中实现面象对象编程,可就不那么直接 ...
- javascript必知必会之prototype
本博客所有内容采用 Creative Commons Licenses 许可使用. 引用本内容时,请保留 朱涛, 出处 ,并且 非商业 . 点击 RSS 进行订阅.(推荐使用 google reade ...
- 《jquery实战》javascript 必知必会(2)
A2 一等公民函数 在传统 OO 语言里,对象包含数据和方法.这些语言里,数据和方法通常是不同的概念:javascript另辟蹊径. 与其他 js 的类型一样,函数可以作为对象处理,如String.N ...
- 《jquery实战》javascript 必知必会(1)
A1 javascript对象的基本原理 JS 的 Object 与其他兄弟面向对象所定义的根本对象,几乎没有什么共同之处. JS 的 Object 一旦创建,它不持有任何数据,而且不表示什么语义. ...
- 学习javaScript必知必会(1)~js介绍、函数、匿名函数、自调用函数、不定长参数
一.简单了解一下JavaScript(js) 1.什么是js? js:是网景公司开发的,是基于客户端浏览器, 面向(基于)对象.事件驱动式的页面脚本语言. 2.什么场景下使用到js? 表单验证.页面特 ...
- 学习javaScript必知必会(3)~数组(数组创建,for...in遍历,辅助函数,高级函数filter、map、reduce)
一.数组: 1.js是弱语言,js中的数组定义时:不用指定数据类型.不用功指定数组长度:数组可以存储任何数据类型的数据 2.数组定义的[ ] 的实质: [] = new Array(); {} = n ...
- 学习javaScript必知必会(4)~事件、事件绑定、取消事件冒泡、事件对象
1.常用的事件: ① onload:页面加载 ② onblur: 失去焦点 onfocus: 获取焦点 ③ onclick:点击 ④ onmouseover:鼠标经过 onmouseout:鼠标离开 ...
随机推荐
- 2000W条数据,加入全文检索的总结
一) 前期准备测试: 旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息 ...
- 学习笔记TF061:分布式TensorFlow,分布式原理、最佳实践
分布式TensorFlow由高性能gRPC库底层技术支持.Martin Abadi.Ashish Agarwal.Paul Barham论文<TensorFlow:Large-Scale Mac ...
- ace_tree总结。各类问题解决办法汇集
首先讲一下怎么使用,然后讲一下出现的问题的解决办法 1.引用js和css文件 ace-extra.min.js.ace.min.css.fuelux.tree.min.js.ace-elements. ...
- 什么是Node.js?带你初识Node
什么是Node.js Nodejs是一个基于Chrome v8引擎的JavaScript运行环境 Node.js使用了一个事件驱动,非阻塞式I/O的模型,使其轻量又高效. Node.js 的包管理器 ...
- 创建mysql快捷登录方式
1.先找到mysql的bin目录,将Mysql.exe发送快捷方式到桌面,到这里还没有完成. 2.然后右键选择属性,将目标后面添加上 -uroot -p 我的完整目标如下: D:\install\my ...
- Mac下Kali虚拟机与宿主机共享文件夹
宿主机: 1.创建文件夹.测试文件 ZhangSan-MacBook-Air:~ zhangsan$ mkdir kalishare && cd kalishare/ ZhangSan ...
- Hue 之 SparkSql interpreters的配置及使用
1.环境说明: HDP 2.4 V3 sandbox hue 4.0.0 2.hue 4.0.0 编译及安装 地址:https://github.com/cloudera/hue/releases/t ...
- 使用vue2.x+webpack+vuex+sass+axios+elementUI等快速搭建前端项目框架
一.本文将分享如何快速搭起基于webpack+vue的前端项目框架,利用vue的自己的脚手架工具vue-cli搭建起基本的环境配置,再通过npm包管理工具引入相应的依赖来完善项目的各种依赖框架.下面是 ...
- ExpandableListView使用
相关博客 ExpandableListView使用 博客内容记录 场景 有时候,使用ListView并不能满足应用程序所需要的功能.有些应用程序需要多组ListView,这时候我们就要使用一种新的控件 ...
- Numpy入门 - 数组聚合运算
本节主要讲解numpy的几个常用的聚合运算,包括求和sum.求平均mean和求方差var. 一.求和sum import numpy as np arr = np.array([[1, 2, 3], ...