JavaScript学习 Ⅲ
六. 面向对象
对象属于一种复合的数据类型,在对象中可以保存多个不同的数据类型的属性。
对象分类
- 内建对象
- 由ES标准种定义的对象。比如:Math String Number
- 宿主对象
- 由JS的运行环境提供的对象,主要指由浏览器提供的对象。比如:BOM DOM
- 自定义对象
- 开发人员创建的对象
创建对象的三种方式
使用new关键字,调用对象的构造函数。
var obj = new Object();
var obj = {}; // 对象字面量创建
var obj = {name:"tom", age=12}; // 使用对象字面量可以在创建时指定对象的属性
添加属性
对象的属性名不强制要求遵守标识符的规范。
尽量按照标识符规范去做。
obj.name = "孙悟空";
obj.gender = "男";
obj.age = 18;
obj["123"] = 789; // 特殊属性名,使用[]形式操作
// 使用[]方式操作属性更加灵活
ver n = 'name';
console.log(obj[n]);
JS对象的属性值,可以是任意的数据类型,甚至可以是一个对象。
删除属性
delete obj.name;
in 运算符
通过该运算符可以检查一个对象中是否含有指定的属性
堆栈
JS中的基本数据类型的值都是直接在栈内存中存储的,值与值之间是独立存在,修改一个变量不影响其他变量。
引用类型是保存在堆内存中的,栈内存中仅保留该类型在堆内存中的地址信息,修改一个变量时会影响其他变量。
当比较两个基本数据类型的值时,就是比较值,而比较两个应用数据类型的值时,是比较对象的内存地址。
访问对象属性
您能够以两种方式访问属性:
objectName.propertyName
objectName["propertyName"]
请不要把字符串、数值和布尔值声明为对象!
如果通过关键词 "new" 来声明 JavaScript 变量,则该变量会被创建为对象:
var x = new String(); // 把 x 声明为 String 对象
var y = new Number(); // 把 y 声明为 Number 对象
var z = new Boolean(); // 把 z 声明为 Boolean 对象
请避免字符串、数值或逻辑对象。他们会增加代码的复杂性并降低执行速度。
枚举对象中的属性
for ... in ... 语句 对象有几个属性,循环体就会执行几次
for(var n in obj){
console.log(n);
m = console.log(obj[n]);
}
// n 为对象的 Key
// m 为对象的 value
作用域
作用域指一个变量的作用范围
JS中一共有两种作用域:
- 全局作用域
- 直接编写在script标签中的 JS 代码,都在全局作用域
- 全局作用域在页面打开时创建,在页面关闭时销毁
- 在全局作用域中有一个全局对象window,代表一个浏览器的窗口,由浏览器创建,我们可以直接使用
- 在全局作用域中 创建的所有变量都会作为 window 对象的属性保存
- 创建的所有函数都会作为 window 对象的方法
- 全局作用域中的变量都是全局变量,在任何页面都可以访问的到
- 函数作用域
- 调用函数时,创建函数作用域,函数执行完毕后,作用域销毁
- 每调用一次函数,就会创建一个新的函数作用域,他们之间是相互独立的
- 在函数作用域中可以访问到全局作用域的变量
当函数和全局存在同名变量时,对于该变量的访问符合就近原则
在函数中访问全局中的同名变量:window.a
在函数中,不使用 var 声明的变量都会成为全局变量
var a = 33;
function fun(){
console.log("a = "+ a);
a = 10 // 实际等于 window.a = 10
}
fun()
console.log("a = "+ a);
[OUTPUT]:
a = 33
a = 10
定义形参就相当于声明变量:
function fun(e){
alert(e);
}
// 可以理解为
function fun(){
var e;
alert(e);
}
声明提前
变量的声明提前(变量提升):使用var关键字声明的变量,会在所有的代码执行之前被声明,如果声明变量时不使用var关键字,则变量不会被提前声明。
只进行提前声明,并没有提前赋值。
<script>
var a = 123;
console.log(a);
</script>
<!--正常运行 输出123-->
<script>
a = 123; // 相当于 window.a = 123
console.log(a);
</script>
<!--正常运行 输出123-->
<script>
console.log(a);
var a = 123;
</script>
<!--输出 a = undefined-->
<script>
console.log(a);
a = 123;
</script>
<!--报错-->
函数的声明提前:使用函数声明形式创建的函数会在所有代码执行之前被创建,我们可以在函数声明前调用。
使用函数表达式创建的函数,不会被提前创建
<script>
function fun(){
console.log("fun");
}
var fun2 = function{
console.log("fun2");
};
fun();
fun2();
</script>
<!--正常运行-->
fun()
function fun(){
console.log("fun");
}
var fun2 = function{
console.log("fun2");
}
<!--正常运行-->
fun2()
function fun(){
console.log("fun");
}
var fun2 = function{
console.log("fun2");
}
<!--报错-->
七. 函数
函数也是一个对象,函数中可以封装一些功能(代码),在需要时可以执行这些功能。
使用typeof检查一个函数对象时,会返回function
创建一个函数对象
a. 构造函数
可以将要封装的代码以字符串的形式传递给构造函数。
封装到函数中的代码不会立即执行,仅在调用时执行。
var fun = new Function();
在实际开发中,很少使用构造函数来创建一个函数对象
b. 函数声明
使用函数声明来创建一个函数
function 函数名([形参1,形参2·····]){
语句······
}
c. 函数表达式
使用函数表达式来创建一个函数
var 函数名 = function([形参1,形参2······]){
语句······
};
将匿名函数赋值给变量。
函数的参数
- 在传入参数时,函数解析器不会检查实参的类型,所以要注意函数有可能会接收到非法的参数
- 调用函数时,解析器不会检查实参的数量,多余的实参不会被赋值
- 如果实际参数的数量少于形式参数的数量,则没有对应实际参数的形式参数值为
undefined
- 函数的实际参数可以是任意数据类型,也可以是一个函数
函数返回值
使用return来设置返回值,如果return语句后不跟任何值或没有return语句就相当于返回一个undefined。
function Fun(){
return 1;
}
Fun() // 调用函数,相当于使用函数的返回值
Fun // 函数对象,相当于使用函数对象本身
对象中的函数
对象的属性值可以是任何的数据类型,也可以是个函数
var obj = new Ojbect();
obj.sayName = function(){
console.log(obj.name);
};
如果一个函数作为一个对象的属性保存,我们称这个函数是这个对象的方法
函数与方法只是名称上的区别,实质没有任何区别
var obj = {
name:"tom",
age:18,
SayName:function(){
console.log(obj.name);
}
};
函数的方法
call()
和apply()
这两个方法都是函数的方法,需要通过函数对象来调用
当对两个函数调用call()
和apply()
都会调用函数执行,但是调用call()
和apply()
可以指定一个对象为第一个参数(this)。
function fun(){
alert(this);
}
var obj = {}
fun(); // window
fun.call(obj); // Object
fun.apply(obj); // Object
call()方法可以将实参在对象之后依次传递
apply()方法可以将实参封装到一个数组中统一传递
function fun(a, b){
statement;
}
var obj = {}
fun.call(obj, a, b);
fun.apply(obj, [a, b]);
this
解析器在每次调用函数时,都会向函数内部传递两个隐含的参数。
第一个隐含的参数就是this
this
指的是一个对象,这个对象我们称为上下文对象
根据函数的调用方式不同,this
会指向不同的对象
- 以函数方式调用,
this
永远都是window - 以方法形式调用,
this
就是调用方法的那个对象 - 以构造函数的形式调用时,
this
是新创建的那个对象 - 使用
call
和apply
调用时,this
是指定的那个对象
arguments
第二个隐含的参数就是arguments
封装实参的对象 arguments
,是一个类数组对象,可以通过索引来操作数据,也可以获取长度;
在调用函数时,我们所传递的实参都会在arguments
中保存
arguments.length
可以用来获取实参的长度
console.log(arguments[0]) // 第一个参数
里面有一个属性callee
,这个属性对应一个函数对象,就是当前正在指向的函数的对象
function fun(a, b){
console.log(a);
console.log(arguments.callee = fun);
}
// True
JavaScript学习 Ⅲ的更多相关文章
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”
Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...
- JavaScript学习(3):函数式编程
在这篇文章里,我们讨论函数式编程. 什么是函数式编程?根据百度百科的描述,“函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus). ...
- JavaScript学习(2):对象、集合以及错误处理
在这篇文章里,我们讨论一下JavaScript中的对象.数组以及错误处理. 1. 对象 对象是JavaScript中的一种基本类型,它内部包含一些属性,我们可以对这些属性进行增删操作. 1.1 属性 ...
- JavaScript学习13 JavaScript中的继承
JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
- JavaScript学习11 数组排序实例
JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...
- JavaScript学习10 JS数据类型、强制类型转换和对象属性
JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...
- JavaScript学习09 函数本质及Function对象深入探索
JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...
- JavaScript学习08 Cookie对象
JavaScript学习08 Cookie对象 JavaScript Cookie Cookie对象: Cookie是一种以文件的形式保存在客户端硬盘的Cookies文件夹中的用户数据信息(Cooki ...
随机推荐
- Python--文件操作(操作文件)
文件的操作包含:读.写.修改 文件的多种操作: # 读取文件的所有内容 data = open("yesteday.txt", encoding="utf-8" ...
- PCB制图--VCC、VDD、VEE、VSS、VDDA、VSSA
VDDA为所有的模拟电路部分供电,包括: ADC模块,复位电路,PVD(可编程电压监测器),PLL,上电复位(POR)和掉电复位(PDR)模块,控制VBAT切换的开关等.即使不 使用ADC功能,也需要 ...
- JDK Base64编解码1.7和1.8的坑
场景 对接一个第三方api接口,其中签名部分用的是JDK8的编码.我们线上采用JDK7,导致项目无法编译 替换编解码部分为1.7的代码,然后签名又不对 所以坑就在这里,结论,1.7的编解码有换行符导致 ...
- pytest 多个PY文件执行共享变量及用fixture和conftest
------------恢复内容开始------------ 1.pytest需要测试多个py文件,这些文件有一定的依赖关系,同时执行的时候,需要只执行一次初始化setup,结束再执行一次teardo ...
- linux下解决vim打开文件乱码现象
用VIM打开一个文件进行编辑时最下面的任务栏出现中文乱码,严重影响编写代码. 因为VIM默认的语言支持不行, 修改~/.vimrc 文件或/etc/vimrc 文件,添加一下代码: set encod ...
- Sequence in the Pocket【思维+规律】
Sequence in the Pocket 题目链接(点击) DreamGrid has just found an integer sequence in his right pocket. A ...
- 震惊!ConcurrentHashMap里面也有死循环,作者留下的“彩蛋”了解一下?
JDK BUG 这篇文章,聊一下我最近才知道的一个关于 JDK 8 的 BUG 吧. 首先说一下我是怎么发现这个 BUG 的呢? 大家都知道我对 Dubbo 有一定的关注,前段时间 Dubbo 2.7 ...
- Excel经典教程之一
照片名称:未命名 照片名称:自动筛选 照片名称:在Excel中字符替换 照片名称:在Excel中直接编辑“宏” 照片名称:在Excel中为导入外部数据 照片名称:在Excel中行列快速转换 照片名称: ...
- 01 . MongoDB简介及部署配置
简介 什么是MongoDB? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用 ...
- Andrew Ng - 深度学习工程师 - Part 2. 改善深层神经网络:超参数调试、正则化以及优化(Week 2. 优化算法)
===========第2周 优化算法================ ===2.1 Mini-batch 梯度下降=== epoch: 完整地遍历了一遍整个训练集 ===2.2 理解Mini-bat ...