六. 面向对象

对象属于一种复合的数据类型,在对象中可以保存多个不同的数据类型的属性。

对象分类

  1. 内建对象

    • 由ES标准种定义的对象。比如:Math String Number
  2. 宿主对象
    • 由JS的运行环境提供的对象,主要指由浏览器提供的对象。比如:BOM DOM
  3. 自定义对象
    • 开发人员创建的对象

创建对象的三种方式

使用new关键字,调用对象的构造函数。

  1. var obj = new Object();
  2. var obj = {}; // 对象字面量创建
  3. var obj = {name:"tom", age=12}; // 使用对象字面量可以在创建时指定对象的属性

添加属性

对象的属性名不强制要求遵守标识符的规范。

尽量按照标识符规范去做。

  1. obj.name = "孙悟空";
  2. obj.gender = "男";
  3. obj.age = 18;
  4. obj["123"] = 789; // 特殊属性名,使用[]形式操作
  5. // 使用[]方式操作属性更加灵活
  6. ver n = 'name';
  7. console.log(obj[n]);

JS对象的属性值,可以是任意的数据类型,甚至可以是一个对象。

删除属性

  1. delete obj.name;

in 运算符

通过该运算符可以检查一个对象中是否含有指定的属性

堆栈

JS中的基本数据类型的值都是直接在栈内存中存储的,值与值之间是独立存在,修改一个变量不影响其他变量。

引用类型是保存在堆内存中的,栈内存中仅保留该类型在堆内存中的地址信息,修改一个变量时会影响其他变量。

当比较两个基本数据类型的值时,就是比较值,而比较两个应用数据类型的值时,是比较对象的内存地址。

访问对象属性

您能够以两种方式访问属性:

  1. objectName.propertyName
  2. objectName["propertyName"]

请不要把字符串、数值和布尔值声明为对象!

如果通过关键词 "new" 来声明 JavaScript 变量,则该变量会被创建为对象:

  1. var x = new String(); // 把 x 声明为 String 对象
  2. var y = new Number(); // 把 y 声明为 Number 对象
  3. var z = new Boolean(); // 把 z 声明为 Boolean 对象

请避免字符串、数值或逻辑对象。他们会增加代码的复杂性并降低执行速度。

枚举对象中的属性

for ... in ... 语句 对象有几个属性,循环体就会执行几次

  1. for(var n in obj){
  2. console.log(n);
  3. m = console.log(obj[n]);
  4. }
  5. // n 为对象的 Key
  6. // m 为对象的 value

作用域

作用域指一个变量的作用范围

JS中一共有两种作用域:

  1. 全局作用域

    • 直接编写在script标签中的 JS 代码,都在全局作用域
    • 全局作用域在页面打开时创建,在页面关闭时销毁
    • 在全局作用域中有一个全局对象window,代表一个浏览器的窗口,由浏览器创建,我们可以直接使用
    • 在全局作用域中 创建的所有变量都会作为 window 对象的属性保存
    • 创建的所有函数都会作为 window 对象的方法
    • 全局作用域中的变量都是全局变量,在任何页面都可以访问的到
  2. 函数作用域
    • 调用函数时,创建函数作用域,函数执行完毕后,作用域销毁
    • 每调用一次函数,就会创建一个新的函数作用域,他们之间是相互独立的
    • 在函数作用域中可以访问到全局作用域的变量

当函数和全局存在同名变量时,对于该变量的访问符合就近原则

在函数中访问全局中的同名变量:window.a

在函数中,不使用 var 声明的变量都会成为全局变量

  1. var a = 33;
  2. function fun(){
  3. console.log("a = "+ a);
  4. a = 10 // 实际等于 window.a = 10
  5. }
  6. fun()
  7. console.log("a = "+ a);
  8. [OUTPUT]:
  9. a = 33
  10. a = 10

定义形参就相当于声明变量:

  1. function fun(e){
  2. alert(e);
  3. }
  4. // 可以理解为
  5. function fun(){
  6. var e;
  7. alert(e);
  8. }

声明提前

变量的声明提前(变量提升):使用var关键字声明的变量,会在所有的代码执行之前被声明,如果声明变量时不使用var关键字,则变量不会被提前声明。

只进行提前声明,并没有提前赋值。

  1. <script>
  2. var a = 123;
  3. console.log(a);
  4. </script>
  5. <!--正常运行 输出123-->
  6. <script>
  7. a = 123; // 相当于 window.a = 123
  8. console.log(a);
  9. </script>
  10. <!--正常运行 输出123-->
  11. <script>
  12. console.log(a);
  13. var a = 123;
  14. </script>
  15. <!--输出 a = undefined-->
  16. <script>
  17. console.log(a);
  18. a = 123;
  19. </script>
  20. <!--报错-->

函数的声明提前:使用函数声明形式创建的函数会在所有代码执行之前被创建,我们可以在函数声明前调用。

使用函数表达式创建的函数,不会被提前创建

  1. <script>
  2. function fun(){
  3. console.log("fun");
  4. }
  5. var fun2 = function{
  6. console.log("fun2");
  7. };
  8. fun();
  9. fun2();
  10. </script>
  11. <!--正常运行-->
  12. fun()
  13. function fun(){
  14. console.log("fun");
  15. }
  16. var fun2 = function{
  17. console.log("fun2");
  18. }
  19. <!--正常运行-->
  20. fun2()
  21. function fun(){
  22. console.log("fun");
  23. }
  24. var fun2 = function{
  25. console.log("fun2");
  26. }
  27. <!--报错-->

七. 函数

函数也是一个对象,函数中可以封装一些功能(代码),在需要时可以执行这些功能。

使用typeof检查一个函数对象时,会返回function

创建一个函数对象

a. 构造函数

可以将要封装的代码以字符串的形式传递给构造函数。

封装到函数中的代码不会立即执行,仅在调用时执行。

  1. var fun = new Function();

在实际开发中,很少使用构造函数来创建一个函数对象

b. 函数声明

使用函数声明来创建一个函数

  1. function 函数名([形参1,形参2·····]){
  2. 语句······
  3. }

c. 函数表达式

使用函数表达式来创建一个函数

  1. var 函数名 = function([形参1,形参2······]){
  2. 语句······
  3. };

将匿名函数赋值给变量。

函数的参数

  • 在传入参数时,函数解析器不会检查实参的类型,所以要注意函数有可能会接收到非法的参数
  • 调用函数时,解析器不会检查实参的数量,多余的实参不会被赋值
  • 如果实际参数的数量少于形式参数的数量,则没有对应实际参数的形式参数值为undefined
  • 函数的实际参数可以是任意数据类型,也可以是一个函数

函数返回值

使用return来设置返回值,如果return语句后不跟任何值或没有return语句就相当于返回一个undefined。

  1. function Fun(){
  2. return 1;
  3. }
  4. Fun() // 调用函数,相当于使用函数的返回值
  5. Fun // 函数对象,相当于使用函数对象本身

对象中的函数

对象的属性值可以是任何的数据类型,也可以是个函数

  1. var obj = new Ojbect();
  2. obj.sayName = function(){
  3. console.log(obj.name);
  4. };

如果一个函数作为一个对象的属性保存,我们称这个函数是这个对象的方法

函数与方法只是名称上的区别,实质没有任何区别

  1. var obj = {
  2. name:"tom",
  3. age:18,
  4. SayName:function(){
  5. console.log(obj.name);
  6. }
  7. };

函数的方法

call()apply()

这两个方法都是函数的方法,需要通过函数对象来调用

当对两个函数调用call()apply()都会调用函数执行,但是调用call()apply()可以指定一个对象为第一个参数(this)。

  1. function fun(){
  2. alert(this);
  3. }
  4. var obj = {}
  5. fun(); // window
  6. fun.call(obj); // Object
  7. fun.apply(obj); // Object

call()方法可以将实参在对象之后依次传递

apply()方法可以将实参封装到一个数组中统一传递

  1. function fun(a, b){
  2. statement;
  3. }
  4. var obj = {}
  5. fun.call(obj, a, b);
  6. fun.apply(obj, [a, b]);

this

解析器在每次调用函数时,都会向函数内部传递两个隐含的参数。

第一个隐含的参数就是this

this指的是一个对象,这个对象我们称为上下文对象

根据函数的调用方式不同,this会指向不同的对象

  1. 以函数方式调用,this永远都是window
  2. 以方法形式调用,this就是调用方法的那个对象
  3. 以构造函数的形式调用时,this是新创建的那个对象
  4. 使用callapply调用时,this是指定的那个对象

arguments

第二个隐含的参数就是arguments

封装实参的对象 arguments,是一个类数组对象,可以通过索引来操作数据,也可以获取长度;

在调用函数时,我们所传递的实参都会在arguments中保存

arguments.length可以用来获取实参的长度

  1. console.log(arguments[0]) // 第一个参数

里面有一个属性callee,这个属性对应一个函数对象,就是当前正在指向的函数的对象

  1. function fun(a, b){
  2. console.log(a);
  3. console.log(arguments.callee = fun);
  4. }
  5. // True

JavaScript学习 Ⅲ的更多相关文章

  1. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  2. Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”

    Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...

  3. JavaScript学习(3):函数式编程

    在这篇文章里,我们讨论函数式编程. 什么是函数式编程?根据百度百科的描述,“函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus). ...

  4. JavaScript学习(2):对象、集合以及错误处理

    在这篇文章里,我们讨论一下JavaScript中的对象.数组以及错误处理. 1. 对象 对象是JavaScript中的一种基本类型,它内部包含一些属性,我们可以对这些属性进行增删操作. 1.1 属性 ...

  5. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...

  6. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  7. JavaScript学习11 数组排序实例

    JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...

  8. JavaScript学习10 JS数据类型、强制类型转换和对象属性

    JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...

  9. JavaScript学习09 函数本质及Function对象深入探索

    JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...

  10. JavaScript学习08 Cookie对象

    JavaScript学习08 Cookie对象 JavaScript Cookie Cookie对象: Cookie是一种以文件的形式保存在客户端硬盘的Cookies文件夹中的用户数据信息(Cooki ...

随机推荐

  1. TensorFlow开发者证书 中文手册

    经过一个月的准备,终于通过了TensorFlow的开发者认证,由于官方的中文文档较少,为了方便大家了解这个考试,同时分享自己的备考经验,让大家少踩坑,我整理并制作了这个中文手册,请大家多多指正,有任何 ...

  2. Spring之多数据源切换的应用

    这不是一个新的知识点扩展,顶多算是,Spring的AOP特性的一个应用.那么下面开始今天的学习之旅! 场景 数据库读写分离,或者分库,总之多数据源的场景,怎么样实现自动切换(PS:不考虑各种分库分表的 ...

  3. epic无法登陆怎么办【百分百解决】

    epic无法登陆怎么办(感谢吾爱破解吧www.52pjb.net)站长提供的文章教程以及解决思路,谢谢大佬,更详细的解决办法可以参考下他的网站解决的方法实例! epic登陆不上去怎么办?随着GTA5免 ...

  4. 安装并配置Samba

    1. 安装 samba ~$sudo apt-get install samba 2. 修改 samba 的配置文件 ~$sudo gedit /etc/samba/smb.conf 添加如下内容 [ ...

  5. Dubbo笔记(一)

    一.简介 在编写分布式场景下高并发.高扩展的系统对技能的要求很高,因为这个过程会涉及到序列化/反序列化.多线程.网络编程.设计模式.性能优化等众多专业知识.而Dubbo框架对这些专业知识做了更高层的抽 ...

  6. 命令中"|"的意义

    管道命令,是指 | 的左边运行结果是|右边的输入条件或者范围.如:history | grep date指从history这条命令运行的结果中显示包含有 “date” 的命令 下面举一个例子: 这是运 ...

  7. Mysql使用xtrabackup备份失败处理

    在生产环境中使用的是xtrabackup,对mysql进行备份,每天0点开始备份,周日是全量备份,其他时间是基于周日做的增量备份,通过脚本实现,每天备份完成后会发送短信,突然有一天,备份全部失败,手动 ...

  8. #PHP 类的多继承实现之 traits.md

    TRAIT PHP本身是并不支持多继承的,也就是,一个类只能继承一个类,为了满足业务需求,后来有了一些解决方法,例如,链式继承,B继承A,然后C继承B,这样,C就同时继承了AB, 此外还有接口,因为接 ...

  9. Downloadmanager实现app实现的升级下载使用

    1.app升级下载现在不推荐使用downloadmanager下载: 原因有下面的几个方面: (1)三星note系列部分手机需要手动打开这个权限才能用这个功能,而有些国产手机更加nb了直接个阉割了(d ...

  10. 区间dp 能量项链 洛谷p1063

    题目大意:如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为 (Mars单位),新产生的珠子的头标记为m,尾标记为n. 需要时,Mars人就用吸盘夹住 ...