diff --git a/03-JavaScript基础/01-JavaScript语法基础:JS简介&变量.md b/03-JavaScript基础/01-JavaScript语法基础:JS简介&变量.md index 2ac80e9..bf511a3 100644 --- a/03-JavaScript基础/01-JavaScript语法基础:JS简介&变量.md +++ b/03-JavaScript基础/01-JavaScript语法基础:JS简介&变量.md @@ -14,19 +14,8 @@ Web前端有三层: - JavaScript:从交互的角度,描述**行为**(提升用户体验) - JavaScript是世界上用的最多的**脚本语言**。 -补充: - -- 编译执行:把代码编译成CPU认识的语言(文件),然后整体的执行。 - - -- **脚本语言:不需要编译**,直接在运行时**边解析边执行**的语言。 - -- 弱类型语言:简单定义一个变量,可以有多种数据类型。(var temp) - - ### JavaScript历史背景介绍 布兰登 • 艾奇(Brendan Eich,1961年~),1995年在网景公司,发明的JavaScript。 @@ -90,8 +79,7 @@ ECMAScript在2015年6月,发布了ECMAScript 6版本,语言的能力更强 ### 浏览器工作原理 - -20180124_1700.png +![](http://img.smyhvae.com/20180124_1700.png) 1、User Interface 用户界面,我们所看到的浏览器 @@ -107,19 +95,13 @@ ECMAScript在2015年6月,发布了ECMAScript 6版本,语言的能力更强 7、Data Persistence(持久化) 数据持久化,数据存储 cookie、HTML5中的sessionStorage - - 参考链接: - - - - ### JavaScript是前台语言 JavaScript是前台语言,而不是后台语言。 -JavaScript运行在用户的终端网页上,而不是服务器上,所以我们称为“**前台语言**”。JavaScript就是一个简单的制作页面效果的语言,就是服务于页面的交互效果、美化、绚丽、不能操作数据库。 +JavaScript运行在用户的终端网页上,而不是服务器上,所以我们称为“**前台语言**”。就是服务于页面的交互效果、美化,不能操作数据库。 **后台语言**是运行在服务器上的,比如PHP、ASP、JSP等等,这些语言都能够操作数据库,都能够对数据库进行“增删改查”操作。Node.js除外。 @@ -145,9 +127,9 @@ PS:JS机械重复性的劳动几乎为0,基本都是创造性的劳动。而 ### 编程语言的分类 -- 解释型语言:边解释边执行。例如:JavaScript、php。 +- 解释型语言:**边解析边执行**,不需要事先编译。例如:JavaScript、php。 -- 编译型语言:事先把所有的代码翻译成计算机能够执行的指令。例如:c、c++。 +- 编译型语言:事先把所有的代码翻译成计算机能够执行的指令,然后整体执行。例如:c、c++。 ## 开始写第一行JavaScript代码 @@ -173,7 +155,6 @@ PS:在Sublime Text里,输入` ``` - ### alert语句 我们要学习的第一个语句,就是alert语句。 @@ -332,19 +313,18 @@ JS代码如下: “字面量”即**常量**,是固定值。看见什么,它就是什么。 -简单的直接量有2种:数字、字符串。 +简单的字面量有2种:数字、字符串。 -(1)数值的直接量的表达非常简单,写上去就行了,不需要任何的符号。例如: +(1)数值的字面量非常简单,写上去就行了,不需要任何的符号。例如: ```javascript 1 alert(886); //886是数字,所以不需要加引号。 ``` -(2)字符串也很简单,但一定要加上引号。可以是单词、句子等。 +(2)字符串的字面量也很简单,但一定要加上引号。可以是单词、句子等。 温馨提示:100是数字,"100"是字符串。 - ## 变量 ### 变量的定义和赋值 @@ -414,19 +394,21 @@ implements、import、int、interface、long、native、package、private、prot var a = 888; //变量2 ``` - 我们来整理一下变量的命名规则: 驼峰命名规则:getElementById/matherAndFather/aaaOrBbbAndCcc - 1.变量命名必须以字母或是下标符号”_”或者”$”为开头。 -2.变量名长度不能超过255个字符。 -3.变量名中不允许使用空格,首个字不能为数字。 -4.不用使用脚本语言中保留的关键字及保留符号作为变量名。 -5.变量名区分大小写。(javascript是区分大小写的语言) -6.汉语可以作为变量名。但是不建议使用,因为 low +2.变量名长度不能超过255个字符。 + +3.变量名中不允许使用空格,首个字不能为数字。 + +4.不用使用脚本语言中保留的关键字及保留符号作为变量名。 + +5.变量名区分大小写。(javascript是区分大小写的语言) + +6.汉语可以作为变量名。但是不建议使用,因为 low ## 变量的数据类型 @@ -435,19 +417,17 @@ implements、import、int、interface、long、native、package、private、prot 数据类型指的就是字面量的类型,在JS中一共有六种数据类型: - - **基本数据类型(值类型)**:String 字符串、Number 数值、Boolean 布尔值、Null 空值、Undefined 未定义。 - **引用数据类型(引用类型)**:Object 对象。 PS:内置对象function、Array、Date、RegExp、Error等都是属于Object。 - 基本数据类型:参数赋值的时候,传数值。 引用数据类型:参数赋值的时候,传地址(修改的同一片内存空间)。 -接下来,我们讲一下基本数据类型。 +接下来,我们详细讲一下基本数据类型。 ### String 字符串 @@ -485,18 +465,14 @@ PS:内置对象function、Array、Date、RegExp、Error等都是属于Object var str = `hello"; ``` - -(2)引号不能嵌套:双引号里不能再放双引号,单引号里不能再放单引号。但是单引号里可以嵌套双引号: - - - +(2)引号不能嵌套:双引号里不能再放双引号,单引号里不能再放单引号。但是单引号里可以嵌套双引号。 ### 数值型:Number 在JS中所有的数值都是Number类型,包括整数和浮点数(小数)。 ```javascript - var a = 100; //定义了一个变量a,并且赋值100 + var a = 100; //定义了一个变量a,并且赋值100 console.log(typeof a); //输出a变量的类型 ``` @@ -508,13 +484,13 @@ number **补充知识:** -**typeof()**表示“**获取变量的类型**”,返回的是小写,语法为: +`typeof()`表示“**获取变量的类型**”,返回的是小写,语法为: ``` typeof 变量 ``` -**在JavaScript中,只要是数,就是数值型(number)的**。无论整浮、浮点数(即小数)、无论大小、无论正负,都是number类型的。 +**在JavaScript中,只要是数,就是 number 数值型的。无论整浮、浮点数(即小数)、无论大小、无论正负,都是 number 类型的。 **数值范围:** @@ -530,13 +506,12 @@ typeof 变量 - 无穷小(负无穷):-Infinity -注意,使用typeof检查Infinity也会返回number。 +注意,使用`typeof`检查Infinity也会返回number。 **NaN和isNaN()函数:** (1)NaN:是一个特殊的数字,表示Not a Number,非数值。比如: - ```javascript console.log("abc" / 18); //结果是NaN @@ -549,7 +524,6 @@ Undefined和任何数值计算的结果为NaN。NaN 与任何值都不相等, (2)isNaN() :任何不能被转换为数值的值都会导致这个函数返回 true。 - ```javascript isNaN(NaN);// true isNaN("blue"); // true @@ -557,7 +531,6 @@ Undefined和任何数值计算的结果为NaN。NaN 与任何值都不相等, ``` - **浮点数的运算**: 在JS中,整数的运算可以很精确,但是**小数的运算,可能会得到一个不精确的结果**。所以,千万不要使用JS进行对精确度要求比较高的运算。 @@ -573,7 +546,6 @@ Undefined和任何数值计算的结果为NaN。NaN 与任何值都不相等, 我们知道,所有的运算都要转换成二进制去计算,然而,二进制是无法精确表示1/10的。因此存在小数的计算不精确的问题。 - ### 连字符和加号的区别 键盘上的`+`可能是连字符,也可能是数字的加号。如下: @@ -625,16 +597,12 @@ Undefined和任何数值计算的结果为NaN。NaN 与任何值都不相等, 于是我们明白了,在变量中加入字符串进行连接,可以被同化为字符串。 - - ### 布尔值:Boolean true 和 fase。 - ### null和undefined - **`null`**:空值 - Null类型的值只有一个,就是null。比如:`var a = null`。 @@ -643,7 +611,6 @@ true 和 fase。 - 使用 typeof 检查一个null值时,会返回object。 - **`undefined`**:未定义 - Undefined类型的值只有一个,就是undefind @@ -652,19 +619,14 @@ true 和 fase。 - 使用 type of 检查一个undefined时,会返回undefined。 - - null和undefined有最大的相似性。看看null == undefined的结果(true)也就更加能说明这点。 但是null ===undefined的结果(false)。不过相似归相似,还是有区别的,就是和数字运算时,10 + null结果为:10;10 + undefined结果为:NaN。 - - 任何数据类型和undefined运算都是NaN; - 任何值和null运算,null可看做0运算。 - - ## 变量值的传递(赋值) 语句: @@ -779,7 +741,6 @@ null和undefined有最大的相似性。看看null == undefined的结果(true) 1 ``` - ## 强制类型转换 强制类型转换:将一个数据类型强制转换为其他的数据类型。 @@ -792,9 +753,9 @@ null和undefined有最大的相似性。看看null == undefined的结果(true) ### 任何简单类型转换成String -**方法1**:变量+"" 或者 变量+"abc" +**方法一**:变量+"" 或者 变量+"abc" -**方法二:**调用toString()方法。如下: +**方法二**:调用toString()方法。如下: ``` 变量.toSting() @@ -804,7 +765,6 @@ null和undefined有最大的相似性。看看null == undefined的结果(true) 注意:null和undefined这两个值没有toString()方法,所以它们不能用方法二。如果调用,会报错。 - **方法三**:调用String()函数。如下: ``` @@ -817,7 +777,6 @@ String(变量) - 但是对于null和undefined,就不会调用toString()方法。它会将 null 直接转换为 "null"。将 undefined 直接转换为 "undefined"。 - ### Number()函数:其他的数据类型 --> Number 情况一:字符串 --> 数字 @@ -828,7 +787,6 @@ String(变量) - 3.如果字符串是一个空串或者是一个全是空格的字符串,则转换为0。 - 情况二:布尔 --> 数字 - true 转成 1 @@ -839,23 +797,16 @@ String(变量) - 结果为:0 - 情况四:undefined --> 数字 - 结果为:NaN - - - - - ### `parseInt()`:字符串 --> 数字 > `parseInt()`是专门用来对付字符串的。 **parseInt()的作用是将字符串转为数字**。parse表示“转换”,Int表示“整数”(注意`Int`的拼写)。例如: - ``` parseInt("5"); ``` @@ -874,12 +825,10 @@ String(变量) console.log(parseInt("aaa2017.01在公众号上写了6篇文章")); //打印结果:NaN ``` - (2)自动带有截断小数的功能:**取整,不四舍五入**。 例1: - ```javascript var a = parseInt(5.8) + parseInt(4.7); console.log(a); @@ -922,21 +871,16 @@ String(变量) (4)带两个参数时,表示进制转换。 - - ### `parseFloat()`:字符串 --> 浮点数(小数) > `parseFloat()`是专门用来对付字符串的。 - 道理同上。 - ### 隐式转换 我们知道,`"2"+1`得到的结果其实是字符串,但是`"2"-1`得到的结果却是数值1,这是因为计算机自动帮我们进行了“**隐式转换**”。 - 也就是说,`-`、`*`、`/`、`%``这几个符号会自动进行隐式转换。例如: ```javascript @@ -946,13 +890,45 @@ String(变量) 输出结果: -``` +```javascript 37 ``` 虽然程序可以对`-`、`*`、`/`、`%``这几个符号自动进行“隐式转换”;但作为程序员,我们最好自己完成转换,方便程序的可读性。 +### 转换为Boolean +将其他的数据类型转换为Boolean,可以使用Boolean()函数。 + +- 情况一:数字 --> 布尔 + +除了0和NaN,其余的都是true + +- 情况二:字符串 ---> 布尔 + +除了空串,其余的都是true。 + +- 情况三:null和undefined都会转换为false + +- 情况四:对象也会转换为true + +## 其他进制的数字 + +- 16进制的数字,以`0x`开头 + +- 8进制的数字,以`0`开头 + +- 2进制的数字,`0b`开头(不是所有的浏览器都支持:chrome和火狐支持,IE不支持) + +比如`070`这个字符串,如果我调用parseInt()转成数字时,有些浏览器会当成8进制解析,有些会当成10进制解析。 + +所以,比较建议的做法是:可以在parseInt()中传递第二个参数,来指定数字的进制。例如: + +```javascript + a = "070"; + + a = parseInt(a,10); //转换成十进制 +``` ## 我的公众号 diff --git a/03-JavaScript基础/05-对象简介.md b/03-JavaScript基础/04-对象简介.md similarity index 77% rename from 03-JavaScript基础/05-对象简介.md rename to 03-JavaScript基础/04-对象简介.md index b505afe..9d757e5 100644 --- a/03-JavaScript基础/05-对象简介.md +++ b/03-JavaScript基础/04-对象简介.md @@ -1,20 +1,25 @@ +## 对象简介 +### 基本数据类型和引用数据类型的对比 -## 基本数据类型和引用数据类型的对比 +- **基本数据类型(值类型)**:String 字符串、Number 数值、Boolean 布尔值、Null 空值、Undefined 未定义。 +- **引用数据类型(引用类型)**:Object 对象。 -- **基本数据类型**:字符串 String、数字 Number、布尔 Boolean、未定义 undefined、空 null。 +**基本数据类型**: -- **引用数据类型**:Object、function、Array、Date、RegExp、Error... +基本数据类型的值直接保存在栈内存中,值与值之间是独立存在,修改一个变量不会影响其他的变量。 +**对象**: -JS中的变量都是保存到栈内存中的。 +只要不是那五种基本数据类型,就全都是对象。 -基本数据类型的值直接在栈内存中存储,值与值之间是独立存在,修改一个变量不会影响其他的变量。 +如果使用基本数据类型的数据,我们所创建的变量都是独立,不能成为一个整体。 -对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间。变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用, -当一个通过一个变量修改属性时,另一个也会受到影响。 +对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。 + +对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间。变量保存的是对象的内存地址(对象的引用),**如果两个变量保存的是同一个对象引用,当一个通过一个变量修改属性时,另一个也会受到影响**。 例如: @@ -30,17 +35,6 @@ JS中的变量都是保存到栈内存中的。 当我修改obj的name属性后,会发现,obj2的name属性也会被修改。因为obj和obj2指向的是堆内存中的同一个地址。 - -## 对象简介 - - -以后我们看到的值,只要不是那五种基本数据类型,那就一定是**对象**。 - -如果使用基本数据类型的数据,我们所创建的变量都是独立,不能成为一个整体。 - -对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。 - - ### 对象的分类 1.内建对象: @@ -59,25 +53,25 @@ JS中的变量都是保存到栈内存中的。 - 由开发人员自己创建的对象 +## 对象的属性相关 + ### 创建对象 使用new关键字调用的函数,是构造函数constructor。**构造函数是专门用来创建对象的函数**。 - 例如: ```javascript var obj = new Object(); ``` - -使用typeof检查一个对象时,会返回object。 - +另外,使用`typeof`检查一个对象时,会返回`object`。 ### 向对象添加属性 +在对象中保存的值称为属性。 -语法: +向对象添加属性的语法: ```javascript 对象.属性名 = 属性值; @@ -96,7 +90,6 @@ JS中的变量都是保存到栈内存中的。 obj.age = 18; ``` - ### 获取对象中的属性 语法: @@ -105,7 +98,7 @@ JS中的变量都是保存到栈内存中的。 对象.属性名 ``` -如果获取对象中没有的属性,不会报错而是返回**undefined**。 +如果获取对象中没有的属性,不会报错而是返回`undefined`。 举例: @@ -115,11 +108,13 @@ JS中的变量都是保存到栈内存中的。 console.log(obj.hello); ``` - ### 修改对象的属性值 -语法:对象.属性名 = 新值 +语法: +```javascript + 对象.属性名 = 新值 +``` ```javascript @@ -130,7 +125,7 @@ JS中的变量都是保存到栈内存中的。 ### 删除对象的属性 - +语法: ```javascript delete obj.name; @@ -222,7 +217,7 @@ JS对象的属性值,可以是任意的数据类型,甚至也**可以是一 对象字面量的属性名可以加引号也可以不加,建议不加。如果要使用一些特殊的名字,则必须加引号。 -属性名和属性值是一组一组的键值对结构,键和值之间使用:连接,多个名值对之间使用,隔开。如果一个属性之后没有其他的属性了,就不要写`,` +属性名和属性值是一组一组的键值对结构,键和值之间使用`:`连接,多个值对之间使用`,`隔开。如果一个属性之后没有其他的属性了,就不要写`,` diff --git a/03-JavaScript基础/06-函数.md b/03-JavaScript基础/05-函数.md similarity index 90% rename from 03-JavaScript基础/06-函数.md rename to 03-JavaScript基础/05-函数.md index c33e6f5..efd1ad2 100644 --- a/03-JavaScript基础/06-函数.md +++ b/03-JavaScript基础/05-函数.md @@ -1,14 +1,13 @@ - -## 函数 +## 函数 function 函数:就是将一些语句(功能)进行**封装**,然后通过**调用**的形式,执行这些语句。 - **函数也是一个对象** -- 使用typeof检查一个函数对象时,会返回function +- 使用`typeof`检查一个函数对象时,会返回function **函数的作用:** @@ -92,14 +91,27 @@ PS:方法写完之后,我们在方法的前面输入`/**`,然后回车, 函数名字(); ``` -### 函数的参数:形参和实参 +## 函数的参数:形参和实参 函数的参数包括形参和实参。来看下面的图就懂了: ![](http://img.smyhvae.com/20180118_1130.png) +假设我们定义一个求和的函数。 +**形参:** + +- 可以在函数的`()`中来指定一个或多个形参。 + +- 多个形参之间使用`,`隔开,声明形参就相当于在函数内部声明了对应的变量,但是并不赋值。 + + +**实参**: + +- 在调用函数时,可以在()中指定实参。 + +- 实参将会赋值给函数中对应的形参。 举例: @@ -124,6 +136,7 @@ PS:方法写完之后,我们在方法的前面输入`/**`,然后回车, **实参的类型:** + 函数的实参可以是任意的数据类型。 调用函数时解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查。 @@ -167,7 +180,7 @@ return的作用是结束方法。 - 返回值可以是任意的数据类型,可以是对象,也可以是函数。 -### 1.6 函数名、函数体和函数加载问题(重要,请记住) +### 函数名、函数体和函数加载问题(重要,请记住) 我们要记住:**函数名 == 整个函数**。举例: @@ -247,22 +260,11 @@ return的作用是结束方法。 ``` -## foo() 和 foo 的区别 - - -foo(): - -- 调用函数 - -- 相当于使用函数的返回值 - -foo: - -- 函数对象 - -- 相当于直接使用函数对象 +## fn() 和 fn 的区别【重要】 +- `fn()`:调用函数。相当于获取了函数的返回值。 +- `fn`:函数对象。相当于直接获取了函数对象。 ## 立即执行函数 @@ -292,7 +294,6 @@ foo: 立即执行函数往往只会执行一次。 - ## arguments 在调用函数时,浏览器每次都会传递进两个隐含的参数: diff --git a/03-JavaScript基础/07-面向对象、作用域和this.md b/03-JavaScript基础/06-对象、作用域和this.md similarity index 99% rename from 03-JavaScript基础/07-面向对象、作用域和this.md rename to 03-JavaScript基础/06-对象、作用域和this.md index 7a7e8e0..202ac26 100644 --- a/03-JavaScript基础/07-面向对象、作用域和this.md +++ b/03-JavaScript基础/06-对象、作用域和this.md @@ -43,7 +43,7 @@ 20180314_2109.png -**重要:** +**函数和方法的区别:** 如果一个函数作为一个对象的属性保存,那么我们称这个函数是这个对象的**方法**。调用这个函数就说调用对象的方法(method)。但是它只是名称上的区别,没有其他的区别。 @@ -178,7 +178,7 @@ 在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量。 -**租用与的上下级关系:** +**作用域的上下级关系:** 当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用(**就近原则**)。如果没有则向上一级作用域中寻找,直到找到全局作用域;如果全局作用域中依然没有找到,则会报错ReferenceError。 diff --git a/03-JavaScript基础/07-对象的创建、构造函数和原型.md b/03-JavaScript基础/07-对象的创建、构造函数和原型.md new file mode 100644 index 0000000..524f208 --- /dev/null +++ b/03-JavaScript基础/07-对象的创建、构造函数和原型.md @@ -0,0 +1,327 @@ + + + + +## 面向对象的概念 + +**对象的作用是:封装信息**。比如Student类里可以封装学生的姓名、年龄、成绩等。 + +那为什么不用数组封装信息呢?首先,数组只能存放同一种类型的数据;其次,要... + +对象具有**特征**(属性)和**行为**(方法)。 + +面向对象:可以创建自定义的类型、很好的支持继承和多态。 + +面向对象的特征:封装、继承、多态。 + +## 创建自定义对象的几种方法 + +### 方式一:对象字面量 + +**对象的字面量**就是一个{}。里面的属性和方法均是**键值对**。 + +例如: + +```javascript +var o = { + name: "生命壹号", + age: 26, + isBoy: true, + sayHi: function() { + console.log(this.name); + } + }; + +console.log(o); +``` + +控制台输出: + +20180125_1834.png + + +### 方式二:利用构造函数 + + + +```javascript + //利用构造函数自定义对象 + var stu1 = new Student("smyh"); + console.log(stu1); + stu1.sayHi(); + + var stu2 = new Student("vae"); + console.log(stu2); + stu2.sayHi(); + + + // 创建一个构造函数 + function Student(name) { + this.name = name; //this指的是构造函数中的对象实例 + this.sayHi = function () { + console.log(this.name + "厉害了"); + } + } +``` + +打印结果: + +20180125_1350.png + + + +### 方式三:工厂模式 + +通过该方法可以大批量的创建对象。 + +```javascript + /* + * 使用工厂方法创建对象 + * 通过该方法可以大批量的创建对象 + */ + function createPerson(name, age, gender) { + //创建一个新的对象 + var obj = new Object(); + //向对象中添加属性 + obj.name = name; + obj.age = age; + obj.gender = gender; + obj.sayName = function() { + alert(this.name); + }; + //将新的对象返回 + return obj; + } + + var obj2 = createPerson("猪八戒", 28, "男"); + var obj3 = createPerson("白骨精", 16, "女"); + var obj4 = createPerson("蜘蛛精", 18, "女"); +``` + +**分析:** + +使用工厂方法创建的对象,使用的构造函数都是Object。所以创建的对象都是Object这个类型,就导致我们无法区分出多种不同类型的对象。 + + +## 构造函数 + + + +### new和this + +**this:** + +1、this只出现在函数中。 + +2、谁调用函数,this就指的是谁。 + +3、new People(); People中的this代指被创建的对象实例。 + + +**new之后:** + +(1)开辟内存空间,存储新创建的对象。new Object() + +(2)**把this设置为当前对象** + +(3)执行内部代码,设置对象属性和方法 + +(4)返回新创建的对象 + +因为this指的是new一个Object之后的对象实例。于是,下面这段代码: + +```javascript + // 创建一个函数 + function createStudent(name) { + var student = new Object(); + student.name = name; //第一个name指的是student对象定义的变量。第二个name指的是createStudent函数的参数。二者不一样 + } +``` + +可以改进为: + +```javascript + // 创建一个函数 + function Student(name) { + this.name = name; //this指的是构造函数中的对象实例 + } + +``` + +注意上方代码中的注释。 + +于是,便得出了接下来的代码。 + + +## others + +### json的介绍 + +> 对象字面量和json比较像,这里我们对json做一个简单介绍。 + +JSON:JavaScript Object Notation(JavaScript对象表示形式)。 + +JSON和对象字面量的区别:JSON的属性必须用双引号引号引起来,对象字面量可以省略。 + +json举例: + +``` + { + "name" : "zs", + "age" : 18, + "sex" : true, + "sayHi" : function() { + console.log(this.name); + } + }; +``` + +注:json里一般放常量、数组、对象等,但很少放function。 + +另外,对象和json没有长度,json.length的打印结果是undefined。于是乎,自然也就不能用for循环遍历(因为便利时需要获取长度length)。 + +**json遍历的方法:** + +json 采用 `for...in...`进行遍历,和数组的遍历方式不同。如下: + + +```html + +``` + +打印结果: + +20180203_1518.png + + +## 类和对象 + +函数并没有创建对象的能力,类才有。 + + +```javascript +class Customer { + //属性 + public String Name; + public String Age; + public String Money; + + //方法 + public void Buy (String id,int num,double price) { + self.money -= num * price; //记录订单 + } +} +``` + + + + + + +## new一个构造函数的过程 + +- 1.开辟对内存空间,创建一个新的对象 + +- 2.**把this设置为当前对象** + +- 3.执行内部代码,设置对象属性和方法 + +- 4.返回新创建的对象 + + + +## 原型对象 + +### 原型的引入 + + +```javascript + function Person(name, age, gender) { + this.name = name; + this.age = age; + this.gender = gender; + //向对象中添加一个方法 + this.sayName = function () { + console.log("我是" + this.name); + } + } + + //创建一个Person的实例 + var per = new Person("孙悟空", 18, "男"); + var per2 = new Person("猪八戒", 28, "男"); + per.sayName(); + per2.sayName(); + + console.log(per.sayName == per2.sayName); //打印结果为false +``` + +上方代码中,我们在Person中添加了一个sayName方法,然后在两个实例中进行了调用,造成的结果是:给每个实例都添加了sayName方法。 + +目前我们的sayName方法是在构造函数内部创建的,也就是说,**构造函数每执行一次就会创建一个新的sayName方法**。也是说所有实例的sayName都是唯一的,最后一行代码的打印结果为false。 + +还有一种方式是,将sayName方法在全局作用域中定义:(不建议。看注释) + +```javascript + function Person(name, age, gender) { + this.name = name; + this.age = age; + this.gender = gender; + //向对象中添加一个方法 + this.sayName = fun; + } + + //将sayName方法在全局作用域中定义 + /* + * 将函数定义在全局作用域,污染了全局作用域的命名空间 + * 而且定义在全局作用域中也很不安全 + */ + function fun() { + alert("Hello大家好,我是:" + this.name); + }; +``` + + +比较好的方式是,在原型中添加sayName方法: + +```javascript + Person.prototype.sayName = function(){ + alert("Hello大家好,我是:"+this.name); + }; +``` + +### 原型prototype的概念 + +我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype。这个属性对应着一个对象,这个对象就是我们所谓的原型对象。 + + +如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用时,它所创建的实例对象中都会有一个隐含的属性,指向该构造函数的原型,我们可以通过__proto__来访问该属性。 + +原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。 + +当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用。 + +以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样就不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了。 + + + +### 原型链 + +原型对象也是对象,所以它也有原型,当我们使用一个对象的属性或方法时,会现在自身中寻找,自身中如果有,则直接使用。如果没有则去原型对象中寻找。如果原型对象中有,则使用,如果没有则去原型的原型中寻找,直到找到Object对象的原型。Object对象的原型没有原型,如果在Object原型中依然没有找到,则返回undefined。 + + + + + diff --git a/03-JavaScript基础/04-JavaScript语法基础:数组.md b/03-JavaScript基础/08-数组.md similarity index 100% rename from 03-JavaScript基础/04-JavaScript语法基础:数组.md rename to 03-JavaScript基础/08-数组.md diff --git a/03-JavaScript基础/08-构造函数和原型.md b/03-JavaScript基础/08-构造函数和原型.md deleted file mode 100644 index 3c39e2a..0000000 --- a/03-JavaScript基础/08-构造函数和原型.md +++ /dev/null @@ -1,96 +0,0 @@ - - -## new一个构造函数的过程 - -- 1.开辟对内存空间,创建一个新的对象 - -- 2.**把this设置为当前对象** - -- 3.执行内部代码,设置对象属性和方法 - -- 4.返回新创建的对象 - - - -## 原型对象 - -### 原型的引入 - - -```javascript - function Person(name, age, gender) { - this.name = name; - this.age = age; - this.gender = gender; - //向对象中添加一个方法 - this.sayName = function () { - console.log("我是" + this.name); - } - } - - //创建一个Person的实例 - var per = new Person("孙悟空", 18, "男"); - var per2 = new Person("猪八戒", 28, "男"); - per.sayName(); - per2.sayName(); - - console.log(per.sayName == per2.sayName); //打印结果为false -``` - -上方代码中,我们在Person中添加了一个sayName方法,然后在两个实例中进行了调用,造成的结果是:给每个实例都添加了sayName方法。 - -目前我们的sayName方法是在构造函数内部创建的,也就是说,**构造函数每执行一次就会创建一个新的sayName方法**。也是说所有实例的sayName都是唯一的,最后一行代码的打印结果为false。 - -还有一种方式是,将sayName方法在全局作用域中定义:(不建议。看注释) - -```javascript - function Person(name, age, gender) { - this.name = name; - this.age = age; - this.gender = gender; - //向对象中添加一个方法 - this.sayName = fun; - } - - //将sayName方法在全局作用域中定义 - /* - * 将函数定义在全局作用域,污染了全局作用域的命名空间 - * 而且定义在全局作用域中也很不安全 - */ - function fun() { - alert("Hello大家好,我是:" + this.name); - }; -``` - - -比较好的方式是,在原型中添加sayName方法: - -```javascript - Person.prototype.sayName = function(){ - alert("Hello大家好,我是:"+this.name); - }; -``` - -### 原型prototype的概念 - -我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype。这个属性对应着一个对象,这个对象就是我们所谓的原型对象。 - - -如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用时,它所创建的实例对象中都会有一个隐含的属性,指向该构造函数的原型,我们可以通过__proto__来访问该属性。 - -原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。 - -当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用。 - -以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样就不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了。 - - - -### 原型链 - -原型对象也是对象,所以它也有原型,当我们使用一个对象的属性或方法时,会现在自身中寻找,自身中如果有,则直接使用。如果没有则去原型对象中寻找。如果原型对象中有,则使用,如果没有则去原型的原型中寻找,直到找到Object对象的原型。Object对象的原型没有原型,如果在Object原型中依然没有找到,则返回undefined。 - - - - - diff --git a/03-JavaScript基础/09-面向对象和内置对象.md b/03-JavaScript基础/09-内置对象.md similarity index 72% rename from 03-JavaScript基础/09-面向对象和内置对象.md rename to 03-JavaScript基础/09-内置对象.md index dc4e0d3..7628b06 100644 --- a/03-JavaScript基础/09-面向对象和内置对象.md +++ b/03-JavaScript基础/09-内置对象.md @@ -1,258 +1,5 @@ -## 面向对象的概念 - -**对象的作用是:封装信息**。比如Student类里可以封装学生的姓名、年龄、成绩等。 - -那为什么不用数组封装信息呢?首先,数组只能存放同一种类型的数据;其次,要... - -对象具有**特征**(属性)和**行为**(方法)。 - -面向对象:可以创建自定义的类型、很好的支持继承和多态。 - -面向对象的特征:封装、继承、多态。 - -## 创建自定义对象 - -### 创建单个自定义对象 - -创建一个空白的对象,举例: - -``` - var student= new Object(); -``` - -完整的举例如下: - -```javascript - //调用对象 - console.log(student); //调用对象的方法 - student.sayHi(); //调用对象的方法 - - - //(1)创建一个空白的对象 - var student= new Object(); - - // (2)定义对象的属性 - student.name = "生命壹号"; - student.age = 26; - // (3)定义对象的方法 - student.sayHi = function () { - console.log(this.name + "今年的岁数是" + this.age); //如果要调用自己的name,可以使用this - } -``` - -输出如下: - -20180125_1059.png - -### 引入:创建多个自定义对象 - -举例: - -```javascript - var stu1 = createStudent("生命壹号"); - console.log(stu1); - stu1.sayHi(); - - console.log("------------------"); - - var stu2 = createStudent("许嵩"); - console.log(stu2); - stu2.sayHi(); - - - // 创建一个函数 - function createStudent(name) { - var student = new Object(); - student.name = name; //第一个name指的是student对象定义的变量。第二个name指的是createStudent函数的参数。二者不一样 - student.sayHi = function () { - console.log(this.name + "厉害了"); - } - return student; - } -``` - -打印结果: - -20180125_1121.png - -上方代码中,注意`student.name = name;`中这两个name是不同的。另外,注意this指的是student的this。 - -### new和this - -**this:** - -1、this只出现在函数中。 - -2、谁调用函数,this就指的是谁。 - -3、new People(); People中的this代指被创建的对象实例。 - - -**new之后:** - -(1)开辟内存空间,存储新创建的对象。new Object() - -(2)**把this设置为当前对象** - -(3)执行内部代码,设置对象属性和方法 - -(4)返回新创建的对象 - -因为this指的是new一个Object之后的对象实例。于是,下面这段代码: - -```javascript - // 创建一个函数 - function createStudent(name) { - var student = new Object(); - student.name = name; //第一个name指的是student对象定义的变量。第二个name指的是createStudent函数的参数。二者不一样 - } -``` - -可以改进为: - -```javascript - // 创建一个函数 - function Student(name) { - this.name = name; //this指的是构造函数中的对象实例 - } - -``` - -注意上方代码中的注释。 - -于是,便得出了接下来的代码。 - -**利用构造函数自定义对象:**(改进版) - -```javascript - //利用构造函数自定义对象 - var stu1 = new Student("smyh"); - console.log(stu1); - stu1.sayHi(); - - var stu2 = new Student("vae"); - console.log(stu2); - stu2.sayHi(); - - - // 创建一个构造函数 - function Student(name) { - this.name = name; //this指的是构造函数中的对象实例 - this.sayHi = function () { - console.log(this.name + "厉害了"); - } - } -``` - -打印结果: - -20180125_1350.png - - - -### 属性绑定 - -暂略。 - - -### 对象字面量 - - -**对象的字面量**就是一个{}。里面的属性和方法均是**键值对**。 - -例如: - -```javascript -var o = { - name: "生命壹号", - age: 26, - isBoy: true, - sayHi: function() { - console.log(this.name); - } - }; - -console.log(o); -``` - -控制台输出: - -20180125_1834.png - -### json的介绍 - -> 对象字面量和json比较像,这里我们对json做一个简单介绍。 - -JSON:JavaScript Object Notation(JavaScript对象表示形式)。 - -JSON和对象字面量的区别:JSON的属性必须用双引号引号引起来,对象字面量可以省略。 - -json举例: - -``` - { - "name" : "zs", - "age" : 18, - "sex" : true, - "sayHi" : function() { - console.log(this.name); - } - }; -``` - -注:json里一般放常量、数组、对象等,但很少放function。 - -另外,对象和json没有长度,json.length的打印结果是undefined。于是乎,自然也就不能用for循环遍历(因为便利时需要获取长度length)。 - -**json遍历的方法:** - -json 采用 `for...in...`进行遍历,和数组的遍历方式不同。如下: - - -```html - -``` - -打印结果: - -20180203_1518.png - - -## 类和对象 - -函数并没有创建对象的能力,类才有。 - - -```javascript -class Customer { - //属性 - public String Name; - public String Age; - public String Money; - - //方法 - public void Buy (String id,int num,double price) { - self.money -= num * price; //记录订单 - } -} -``` - - ## 内置对象 内置对象就是指这个语言自带的一些对象,供开发者使用,这些对象提供了一些常用的或是最基本而必要的功能。 diff --git a/03-JavaScript基础/10-JavaScript基础:DOM操作.md b/03-JavaScript基础/10-DOM操作.md similarity index 100% rename from 03-JavaScript基础/10-JavaScript基础:DOM操作.md rename to 03-JavaScript基础/10-DOM操作.md diff --git a/03-JavaScript基础/12-JavaScript基础:事件对象Event和冒泡.md b/03-JavaScript基础/12-事件对象Event和冒泡.md similarity index 100% rename from 03-JavaScript基础/12-JavaScript基础:事件对象Event和冒泡.md rename to 03-JavaScript基础/12-事件对象Event和冒泡.md diff --git a/03-JavaScript基础/13-JavaScript基础:BOM的常见内置方法和内置对象.md b/03-JavaScript基础/13-BOM的常见内置方法和内置对象.md similarity index 100% rename from 03-JavaScript基础/13-JavaScript基础:BOM的常见内置方法和内置对象.md rename to 03-JavaScript基础/13-BOM的常见内置方法和内置对象.md