多数人在学习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必知的特性(继承)的更多相关文章

  1. javaScript 工作必知(七) 对象继承

    对象继承inherit var o = { r: 1 }; var c = function f() { }; c.prototype = o; c.r = 3; alert(o.r);//被继承的属 ...

  2. JavaScript全讲-必知的特性

    上篇讲完JS面向对象的特性,我们今天就来聊聊它的其它特性. JS面向对象的特性较为隐晦,真正使用也是比較少的.而今天我们要讲的,却是在实际开发中常常遇到的特性. 1. 函数式编程 多数人并不知道&qu ...

  3. javascript必知必会:面象对象编程

    面象对象编程技术的核心理念:封装.继承.多态:在一些主流的高级编程语言中,比如:C#,VB.NET,JAVA,PHP等都是很容易实现的,而如果要在javascript中实现面象对象编程,可就不那么直接 ...

  4. javascript必知必会之prototype

    本博客所有内容采用 Creative Commons Licenses 许可使用. 引用本内容时,请保留 朱涛, 出处 ,并且 非商业 . 点击 RSS 进行订阅.(推荐使用 google reade ...

  5. 《jquery实战》javascript 必知必会(2)

    A2 一等公民函数 在传统 OO 语言里,对象包含数据和方法.这些语言里,数据和方法通常是不同的概念:javascript另辟蹊径. 与其他 js 的类型一样,函数可以作为对象处理,如String.N ...

  6. 《jquery实战》javascript 必知必会(1)

    A1 javascript对象的基本原理 JS 的 Object 与其他兄弟面向对象所定义的根本对象,几乎没有什么共同之处. JS 的 Object 一旦创建,它不持有任何数据,而且不表示什么语义. ...

  7. 学习javaScript必知必会(1)~js介绍、函数、匿名函数、自调用函数、不定长参数

    一.简单了解一下JavaScript(js) 1.什么是js? js:是网景公司开发的,是基于客户端浏览器, 面向(基于)对象.事件驱动式的页面脚本语言. 2.什么场景下使用到js? 表单验证.页面特 ...

  8. 学习javaScript必知必会(3)~数组(数组创建,for...in遍历,辅助函数,高级函数filter、map、reduce)

    一.数组: 1.js是弱语言,js中的数组定义时:不用指定数据类型.不用功指定数组长度:数组可以存储任何数据类型的数据 2.数组定义的[ ] 的实质: [] = new Array(); {} = n ...

  9. 学习javaScript必知必会(4)~事件、事件绑定、取消事件冒泡、事件对象

    1.常用的事件: ① onload:页面加载 ② onblur: 失去焦点 onfocus: 获取焦点 ③ onclick:点击 ④ onmouseover:鼠标经过 onmouseout:鼠标离开 ...

随机推荐

  1. 2000W条数据,加入全文检索的总结

    一) 前期准备测试: 旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息 ...

  2. 学习笔记TF061:分布式TensorFlow,分布式原理、最佳实践

    分布式TensorFlow由高性能gRPC库底层技术支持.Martin Abadi.Ashish Agarwal.Paul Barham论文<TensorFlow:Large-Scale Mac ...

  3. ace_tree总结。各类问题解决办法汇集

    首先讲一下怎么使用,然后讲一下出现的问题的解决办法 1.引用js和css文件 ace-extra.min.js.ace.min.css.fuelux.tree.min.js.ace-elements. ...

  4. 什么是Node.js?带你初识Node

    什么是Node.js Nodejs是一个基于Chrome v8引擎的JavaScript运行环境 Node.js使用了一个事件驱动,非阻塞式I/O的模型,使其轻量又高效. Node.js 的包管理器 ...

  5. 创建mysql快捷登录方式

    1.先找到mysql的bin目录,将Mysql.exe发送快捷方式到桌面,到这里还没有完成. 2.然后右键选择属性,将目标后面添加上 -uroot -p 我的完整目标如下: D:\install\my ...

  6. Mac下Kali虚拟机与宿主机共享文件夹

    宿主机: 1.创建文件夹.测试文件 ZhangSan-MacBook-Air:~ zhangsan$ mkdir kalishare && cd kalishare/ ZhangSan ...

  7. 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 ...

  8. 使用vue2.x+webpack+vuex+sass+axios+elementUI等快速搭建前端项目框架

    一.本文将分享如何快速搭起基于webpack+vue的前端项目框架,利用vue的自己的脚手架工具vue-cli搭建起基本的环境配置,再通过npm包管理工具引入相应的依赖来完善项目的各种依赖框架.下面是 ...

  9. ExpandableListView使用

    相关博客 ExpandableListView使用 博客内容记录 场景 有时候,使用ListView并不能满足应用程序所需要的功能.有些应用程序需要多组ListView,这时候我们就要使用一种新的控件 ...

  10. Numpy入门 - 数组聚合运算

    本节主要讲解numpy的几个常用的聚合运算,包括求和sum.求平均mean和求方差var. 一.求和sum import numpy as np arr = np.array([[1, 2, 3], ...