本文共 3328 字,大约阅读时间需要 11 分钟。
本人是个新手,写下博客用于自我复习、自我总结。 如有错误之处,请各位大佬指出。 学习资料来源于:尚硅谷
• 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)。但是它只是名称上的区别没有其他的区别。
console.log(obj.变量名);
请看下例,如果console.log(obj.n);
,虽然n获取到的是属性名,但是在这里它会找obj对象中,属性名为n
的属性值,而不是获取到的那个属性名。所以在下例中,如果这么使用,获取到的将会是undefined。虽然这种方法无法解决,但是在开头介绍过对象使用的第二种方法:console.log(obj[n]);
。这时它就会找获取到的那个属性名的属性值。为什么这样就行?因为这种方式可以做到,判断n是变量名还是属性名。在下图中就可以看到,如果要找的是属性名,是需要双引号包围的,那么这里只要不加双引号,那么它就会把它当成变量名,这时它就会找到这个变量名所取得属性名的属性值。也就是说,如果console.log(obj["n"]);
,那么它找到的还会是属性名为n
的那个属性值。
(如果对Java,C++熟悉的话,对这部分是很好理解的,之后还会提到全局变量和局部变量,用法相近)
通过了解了局部变量,this的用法,那么可以通过工厂方法(即整体的一个小架构)来大规模创建相应对象。
除了用工厂方法可以创建多个对象外,还可以使用构造函数的方法。这种方法更简洁。
(如果了解JAVA、C++会很好理解,虽然现在构造函数换了种用法)除此以外还涉及到了instanceof
的用法。
所以,从目前来看,我们可以向对象中添加一个方法,将sayName方法在全局作用域中定义,这样就解决了问题。但是,将函数定义在全局作用域,污染了全局作用域的命名空间,而且定义在全局作用域中也很不安全。
那么,可以使用一种新的解决办法,原型。(具体使用方法在下方)
补充:
在之前提到了in
的用法,可以取出对象中的属性名, 现在可以用它来判断:
console.log("name" in mc);
使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true。 除此以外,还可以使用console.log(mc.hasOwnProperty("age"));
来检查对象自身中是否含有该属性。只有当对象自身中含有属性时,才会返回true。
mc.hasOwnProperty("name"));
为false。 原型对象也是对象,所以在上例中,console.log(MyClass.prototype);
会根据MyClass中属性的多少来输出。
同时,正因为原型对象也是对象,所以它也有原型。那么原型的原型是什么?:
之前,我们总会看到直接输出一个对象,会得到[object Object]
这样的输出结果,为什么会输出这样的结果,其实是因为,输出的是toString()
方法的返回值。它默认输出的就会是这样的结果。现在,通过调用Person.prototype.toString
,可以为其改变输出结果。
toString()
了,这个toString()
是构造方法中的) 转载地址:http://ioyki.baihongyu.com/