本文共 2574 字,大约阅读时间需要 8 分钟。
一、对象常用属性(掌握)
1、prototype:用来设置或获取(__proto__)对象的原型属性。
Document
2、constructor:用于获取实例对象的构造函数类型,经常性用于判断变量的数据类型是对象还是数组。
Document
二、对象常用方法(了解)
1、isPrototypeOf:用于指示对象是否存在于另一个对象的原型链中。如果存在,返回 true ,否则返回 false 。
Document
2、hasOwnProperty:每个实例对象都有一个hasOwnProperty()方法,用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性。
Document
3、getOwnPropertyDescriptor:用来获取对象属性的描述信息,其中包括属性的value(值)、writable(是否可写)、configurable(是否可设置)、enumerable(是否可枚举)。
注意:必须通过Object对象调用。
Document
4、defineProperty:用来修改对象属性的描述信息。
Document
5、propertyIsEnumerable:用来判断改对象的属性是否可以用for...in枚举(遍历)。
Document
三、对象运算符
1、in:用来判断某个实例是否含有某个属性,不管是不是本地属性。
Document
2、delete:用于删除对象对其属性的引用,当属性失去引用之后会被垃圾回收,不再存在。
Document
3、instanceof:判断一个实例是否属于某种类型。
Document
四、继承(面试中重点)
1、什么是继承?
让子类(构造函数)拥有父类(构造函数)所有特性(包括属性和方法)。在JS中,一切皆对象,所有的类都继承于Object。
如:Array -> Object fn -> Function -> Object
instanceof用于判断指定对象属于哪个类,或者判断是不是某一个类的原型。
2、继承实现
(1)子类实例化出来的对象拥有父类中所有属性和方法; (2)子类实例化出来的对象属于子类,也属于父类。3、实现继承的方式
3.1、构造继承
3.1.1、基本思想
利用call或者apply把父类中通过this指定的属性和方法复制(借用)到子类创建的实例中。
3.1.2、核心
使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)。
3.2.3、缺点
(1)方法都在构造函数中定义; (2)只能继承父类的实例属性和方法,不能继承原型属性/方法,无法实现函数复用; (3)每个子类都有父类实例函数的副本,影响性能。3.2.4、语法
父类.call(this, 参数列表)
Document
父类.apply(this, [参数列表]) 或: 父类.apply(this, arguments)
Document
3.2、原型链继承
3.2.1、每创建一个函数,该函数就会自动带有一个 prototype 属性。该属性是个指针,指向了原型对象,并且可以访问原型对象上的所有属性和方法。
3.2.2、核心 :将父类的实例作为子类的原型。
3.2.3、缺点:父类新增原型方法/原型属性,子类都能访问到,父类一变其它的都变了。
补充:__proto__是每个对象所特有的属性,函数有prototype属性。生成对象时,对象的__proto__指向函数的prototype。
Document
3.3、对象冒充(对象伪造)
对象冒充是指一个对象冒充另外一个对象来实行其他对象的方法,即一个对象将其他对象的方法当做是自身的方法来执行。它不是真正意义的继承。子类实例化出来的对象拥有父类所有属性和方法,但子类并不属于这个父类。
实现步骤:
第一步:克隆父类构造器(原生)中的属性和方法
this.父类 = 父类 this.父类(name, sex) delete this.父类 第二步:克隆父类原型中的属性和方法 for(var i in 父类.prototype){ 子类.prototype[i] = 父类.prototype[i] }Document
3.4、组合继承(构造继承+原型链继承)(真正的继承)
3.4.1、基本思想
所有的实例都能拥有自己的属性,并且可以使用相同的方法,组合继承避免了原型链和借用构造函数的缺陷,结合了两个的优点,是最常用的继承方式。
3.4.2、核心:通过调用父类构造,继承父类的属性并保留传参的优点,然后再通过将父类实例作为子类原型,实现函数复用。
3.4.3、缺点:调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)。
3.4.4、实现步骤
(1)继承父类构造器上的属性和方法
父类.apply(this,arguments) (2)继承父类原型链上的属性和方法 子类.prototype = Object.create(父类.prototype) (3)找回子类丢失的构造器 子类.prototype.constructor = 子类Document
五、对象克隆(拷贝)
对象克隆即把父对象的所有属性和方法,拷贝进子对象。对象克隆分为浅克隆和深克隆。
1、浅克隆(浅拷贝)
只复制基本数据类型的数据。如果用浅拷贝复制引用类型的数据,会出现修改被克隆对象的数据。注意:浅拷贝只适合克隆基本类型的数据。
补充:JS中数据类型分为基本类型和引用类型两种。基本类型的数据存放在栈中,引用类型的数据存放在堆中。
Document
2、深克隆(深拷贝)
深克隆就是能够实现真正意义上的数组和对象的拷贝。思路:递归调用"浅克隆"。
Document
转载地址:http://pfvrn.baihongyu.com/