博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
③Javascript 对象、函数
阅读量:3965 次
发布时间:2019-05-24

本文共 3328 字,大约阅读时间需要 11 分钟。

JavaScript


本人是个新手,写下博客用于自我复习、自我总结。

如有错误之处,请各位大佬指出。
学习资料来源于:尚硅谷


Object对象 ※

• Object类型,我们也称为一个对象。是JavaScript中的引用数据类型。

• 它是一种复合值,它将很多值聚合到一起,可以通过名字访问这些值。

• 对象也可以看做是属性的无序集合,每个属性都是一个名/值对。

• 对象除了可以创建自有属性,还可以通过从一个名为原型的对象那里继承属性。

• 除了字符串、数字、true、false、null和undefined之外,JS中的值都是对象。

• 创建对象有两种方式:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

			

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

			

基本和引用数据类型存储方式 ※

• JS中的变量可能包含两种不同数据类型的值:基本数据类型和引用数据类型。

• JS中一共有5种基本数据类型:String、Number、Boolean、Undefined、Null。

• 基本数据类型的比较是值的比较,也就是只要两个变量的值相等,我们就认为这两个变量相等。而比较两个引用数据类型时,它是比较的对象的内存地址。

• 引用类型的值是保存在内存中的对象。

• 当一个变量是一个对象时,实际上变量中保存的并不是对象本身,而是对象的引用。

• 当从一个变量向另一个变量复制引用类型的值时,会将对象的引用复制到变量中,并不是创建一个新的对象。

• 这时,两个变量指向的是同一个对象。因此,改变其中一个变量会影响另一个。

这就涉及到了两种数据类型的存储方式。

在这里插入图片描述
(如果这里对C++比较熟悉,就会很快理解,这就是相当于指针)

根据上图,这其中还有需要注意分辨的事,当你做如下操作时,

var obj2 = obj;//修改obj的name属性obj.name = "猪八戒";

obj2里的name就也会改变。这是因为他们指向了同一个内存地址。但如果做如下操作:

obj2 = null;

obj可不会变null。这是因为obj2 相当于是个指针,它只负责指向内存地址,对它进行改变可不会对obj 作出改变。

在这里插入图片描述

测试:

			

对象字面量 ※

在之前提到过,创建对象有两种方式,这是第二种方式。

在这里插入图片描述
在这里插入图片描述

			

函数 ※

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

			

函数的参数 ※

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

			

函数返回值 ※

在这里插入图片描述

			

因为这个特性:如果函数中不写return,则也会返回undefined。

像之前用到的alert,它也相当于是个函数。
所以 var result = alert("Hello"); result接受到的会是undefined。


练习 ※

涉及到的内容:

实参可以是一个对象,也可以是一个函数。

fun(function(){alert("hello")});

(这种在调用函数时,实参是一个只在这里定义的函数,这种函数也叫做匿名函数,之后还会遇到)

			

返回值练习 ※

涉及到的主要内容:返回值可以是任意的数据类型

			

立即执行函数 ※ (匿名函数)

在这里插入图片描述

(也就是之前提到过的匿名函数,因为它没有函数名)

			

函数在对象中的运用 ※

涉及到的内容:

因为对象的属性值可以是任何的数据类型,也可以是个函数,在知道了立即执行函数后,它们可以组合在一起。 如下图。(其实也就意味着,这个对象的属性名,就是这个立即执行函数名,需要像函数一样去调用。)正是因为,这个函数是属于这个对象的,所以这个函数也被叫做这个对象的方法。调用这个函数就说调用对象的方法(method)。但是它只是名称上的区别没有其他的区别。

在这里插入图片描述

			

枚举对象中的属性 ※ (in的用法)

在这里插入图片描述

这其中需要注意的是,虽然这个变量取得的是属性的名字,但是使用这种操作不能获取到这个属性名对应的值:console.log(obj.变量名);

请看下例,如果console.log(obj.n);,虽然n获取到的是属性名,但是在这里它会找obj对象中,属性名为n的属性值,而不是获取到的那个属性名。所以在下例中,如果这么使用,获取到的将会是undefined。虽然这种方法无法解决,但是在开头介绍过对象使用的第二种方法:console.log(obj[n]);。这时它就会找获取到的那个属性名的属性值。为什么这样就行?因为这种方式可以做到,判断n是变量名还是属性名。在下图中就可以看到,如果要找的是属性名,是需要双引号包围的,那么这里只要不加双引号,那么它就会把它当成变量名,这时它就会找到这个变量名所取得属性名的属性值。也就是说,如果console.log(obj["n"]);,那么它找到的还会是属性名为n的那个属性值。

(这和之后提到的数组有异曲同工之妙)
在这里插入图片描述
例:

			

作用域

(如果对Java,C++熟悉的话,对这部分是很好理解的,之后还会提到全局变量和局部变量,用法相近)

在这里插入图片描述

			

变量的声明提前 ※

在这里插入图片描述

(当然,我们一般还是会将声明写在前面,这样可以避免麻烦)

			

函数作用域 ※

在这里插入图片描述

			

this的用法 ※

在这里插入图片描述

			

例:使用工厂方法创建对象

通过了解了局部变量,this的用法,那么可以通过工厂方法(即整体的一个小架构)来大规模创建相应对象。

在这里插入图片描述

			

构造函数 ※

除了用工厂方法可以创建多个对象外,还可以使用构造函数的方法。这种方法更简洁。

(如果了解JAVA、C++会很好理解,虽然现在构造函数换了种用法)

除此以外还涉及到了instanceof的用法。

在这里插入图片描述

			

在这里插入图片描述

所以,从目前来看,我们可以向对象中添加一个方法,将sayName方法在全局作用域中定义,这样就解决了问题。但是,将函数定义在全局作用域,污染了全局作用域的命名空间,而且定义在全局作用域中也很不安全。

那么,可以使用一种新的解决办法,原型。(具体使用方法在下方)

			

原型 prototype ※

在这里插入图片描述

			

补充:

在之前提到了in的用法,可以取出对象中的属性名, 现在可以用它来判断:

console.log("name" in mc);
使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true。

除此以外,还可以使用console.log(mc.hasOwnProperty("age"));来检查对象自身中是否含有该属性。只有当对象自身中含有属性时,才会返回true。

所以这时mc.hasOwnProperty("name"));为false。

原型对象也是对象,所以在上例中,console.log(MyClass.prototype);会根据MyClass中属性的多少来输出。

同时,正因为原型对象也是对象,所以它也有原型。那么原型的原型是什么?:

在这里插入图片描述

			

toString的用法 ※

之前,我们总会看到直接输出一个对象,会得到[object Object]这样的输出结果,为什么会输出这样的结果,其实是因为,输出的是toString()方法的返回值。它默认输出的就会是这样的结果。现在,通过调用Person.prototype.toString,可以为其改变输出结果。

在这里插入图片描述
当然也可以像最早一样,直接用 对象的属性名 方式 修改。
在这里插入图片描述
现在通过这种方式,可以不用像以前一样用for … in的方式,或者一个一个手动输出了,只要设计好toString方法,就可以帮我们输出想要的结果了。(这可不是当初类型转换的toString()了,这个toString()是构造方法中的)

			

垃圾回收

在这里插入图片描述

在这里插入图片描述


函数的方法 ※ call apply

在这里插入图片描述

			

转载地址:http://ioyki.baihongyu.com/

你可能感兴趣的文章
Tomcat 7.0 64位免安装解压版 安装及配置
查看>>
Android 网络编程 初级入门(一)
查看>>
No enclosing instance of type Demo06 is accessible.
查看>>
计算机发展中的两大“杀手”
查看>>
《奔跑吧,兄弟》之王祖蓝的"钥匙配箱子"概率统计问题--->>回眸
查看>>
MDK5(Keil for ARM) 工程建立时遇到的问题集锦
查看>>
(正则表达式)邮件地址爬虫
查看>>
c 编译器及#define和typedef
查看>>
Ubuntu下安装GTK+及Glade开发C应用界面
查看>>
Linux下安装eclipse并配置环境变量
查看>>
assertion 'GTK_IS_WIDGET (widget)' failed的解决办法
查看>>
Ubuntu登录管理员账户时,输入密码后一直在登录界面循环
查看>>
Linux下的定时器以及POSIX定时器:timer_settime()
查看>>
POSIX定时器timer_create()以及线程中的gettid() 和pthread_self()
查看>>
c /c++中日期和时间的获取:strftime()函数
查看>>
C语言 回调函数
查看>>
c语言swap(a,b)值交换的4种实现方法
查看>>
c 排序 汇总
查看>>
C 二维数组的动态申请与释放
查看>>
C/C++中产生随机数(rand和srand的用法)
查看>>