当前位置:首页 > JavaScript面向对象精要-学习笔记
第1章 原始类型和引用类型
1.1、 什么是类型
1、原始类型保存为简单数据值。引用类型则保存为对象,其本质是指向内存位置的引用。 2、原始值被直接保存在变量对象内;引用值作为一个指针保存在变量对象内,该指针指向实际对象在内存中的存储位置。
1.2、原始类型
1、5种原始类型
Boolean、number、string、null、undefined。
2、当将原始值赋给一个变量时,该值的具体信息将被复制到变量中。
3、鉴别原始类型:typeof。但typeof null,返回object,因此只能用val===null判断null。 4、===进行比较时不会将变量强制转换为另一种类型。
5、原来类型也拥有方法,是因为他们有封装类型。但null和undefined没有。
1.3、引用类型
1、就是对象,json对象,包含键和值。
2、创建对象,使用new操作符和构造函数,构造函数首字母大写,用于区分非构造函数。 3、js有垃圾收集功能,但不使用时最好将其引用解除,将对象变量置为null。 4、对象的属性随时可增加或删除。
1.4、内建类型实例化
1、Array、Date、Error、Function、Object、RegExp。
2、内建引用类型有字面形式,可不需要使用new操作符合构造函数显式创建。
3、字面形式,数组[]、对象{}、函数function xx或var xx=function(){}、正则表达式/xx/g。
1.5、访问属性
1、可使用“.”或“[]”
1.6、鉴别引用类型
1、函数用typeof返回function,其他返回object;
2、instanceof可鉴别具体引用类型,但鉴别Object都会返回true。Item instanceof Array。
1.7、鉴别数组
1、数组鉴别可用Array.isArray(arr);
1.8、原始封装类型
1、String、Number、Boolean。
2、用instanceof检查对应类型的返回值都是false;如果用typeof检查是返回Object,而不是各种的原来值类型。
1.9、总结
第2章 函数
2.1、声明还是表达式
1、函数声明:用function关键字开头,后面是函数名;函数表达式:函数后面不需要加上函数名,则为匿名表达式,或者赋给变量相当于函数名。
区别:函数声明可以在函数调用之后(js引擎会自动提升至顶部),但表达式,则只有先定义后使用。
2.2、函数就是值
1、使用引用值的地方,都可以直接使用函数。函数也是对象。
2.3、参数
1、js函数被保存在arguments的类似数组的对象中,但不是数组,用Array.isArray(arguments)返回false。
2、可用函数名.length检查个数(注意:返回的函数定义的参数个数,而不是实际传入的参数个数)
2.4、重载
1、重载:函数名相同,其他不同。函数由函数名、参数的个数及其类型组成。 2、js如果函数名相同,那后台定义的覆盖前面的!
3、js的重载,只能通过判断arguments的信息进行模拟!使用typeof、instanceof、个数。
2.5、对象方法
1、this对象:所有函数作用域内都有一个this,表示该函数,全局作用域内this代表全局。 2、改变this。即改变某个方法的内部参数的值,其实就是this的作用域。 1)、call()方法。第一个参数为指定this的值,后面的都是该函数需要传入的参数。 2)、apply()方法。只能接受2个参数,this的值,和参数数组。 3)、bind()方法。第一个参数是要传给新函数的this值,其他参数代表需要被永久设置在新函数中的命名参数。
2.6、总结
第3章 理解对象
3.1、定义属性
1、属性添加或定义时,js调用[[Put]],定义建同时赋值,这个属性为自有属性,只有该对象拥有。js通过[[Set]]修改属性的值。
3.2、属性探测
1、通过in操作符,查找某个属性是否在对象中。In可以检查自有属性和原型属性。 2、hasOwnProperty(),只能检测自有属性,不能检测原型属性。
3.3、删除属性
1、通过delete操作符来彻底移除对象的一个属性。
3.4、属性枚举
1、for-in,对应内部特征[[Enumerable]]设置为true,均可遍历。可通过propertyIsEnumeralbe()方法检查一个属性是否可枚举。
2、可见通过Object.keys(对象名)来获取属性名数组。
3、for-in能返回原型属性和自有属性。而keys只返回自有属性。
3.5、属性类型
1、属性类型有2种:数据属性和访问器属性。访问属性通过get name()或set name()来定义,好处可以对属性加一些操作,同时可以控制只读或只写。
3.6、属性特征
1、两个通用特征:[[Enumerable]]是否可遍历;[[Configurable]]是否可配置。
通过Object.defineProperty()方法,来改变属性特征。3个参数:拥有该属性的对象、属性名、包含需要设置的特征(emumerable、configureable)的属性描述对象。 2、两个数据属性特征:[[Value]]属性的值;[[Writable]]是否可写入。
通过Object.defineProperty()方法,来改变属性特征。value、writable。
注意:如果没有的属性,通过Object.defineProperty()可直接定义这个属性,但所有值为boolean的属性,都默认为false。
3、两个访问器属性特征:[[Get]]和[[Set]],直接定义get和set方法即可。 4、定义多重属性,Object.defineProperties()
5、获取属性特征:Object.getOwnPropertyDescriptor()。参数:对象、属性名。
3.7、禁止修改对象
1、对象可通过[[Extensible]]来禁止其属性的添加操作。 2、Object.preventExtensions()创建不可扩展的对象,通过Object.isExtensible来检查[[Extensible]]的值。
3、对象封印,被封印的对象是不可以扩展,其所有属性都不可配置。可改变属性值。 Object.seal()来封印一个对象,通过Objec.isSeal()来判断是否被封印。
4、对象冻结,对象是不可以扩展,其所有属性都不可配置,不可改变。不可改变属性值。 Object.freeze()来冻结一个对象,通过Object.isFrozen()来判断一个对象是否被冻结。
第4章 构造函数和原型对象
4.1、构造函数
1、可以自己定制构造函数,和普通函数一样,唯一要求首字母大写。没有参数时,new的时候可以不用带括号。可以用instanceof检查某个变量是否是某构造函数生成。业务可以用变量.constructor===检查。
2、构造函数可以初始化一些操作,通过this添加外部的属性或函数。 3、也可以通过Object.defineProperty()方法初始化内部属性。
4.2、原型对象
1、变量.hasOwnProperty(‘属性名’)可以检测自有属性,in可以检查自有和原型属性。
2、[[Prototype]]该属性是一个指向该实例使用的原则对象的指针。可以通过Object.getPrototypeOf()得到[[Prototype]]的属性。Js支持属性_proto_,直接访问[[Prototype]]的属性。也可以isPrototypeOf()方法检查某个对象是另一个对象的原型对象。 3、自有属性会覆盖原型属性,只有自有属性被删除原型属性才能再次起作用。 4、构造函数上使用原型对象,构造函数.prototype.函数名。
5、如果构造函数.prototype={}方式添加自有属性时,向的是Object而不是构造函数,需要通过constructor:构造函数,来指定。
6、Object.seal()和Object.freeze()完全操作的是自有属性,但可以通过prototype添加原型属性。因为[[Prototype]]属性是对象实例的自有属性,属性本身被冻结,但其指向的值(原型对象)并没有被冻结。
7、内建对象也可以添加原型属性,比如Array、String等。
4.3、总结
共分享92篇相关文档