博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript基础学习——面向对象编程应用
阅读量:3916 次
发布时间:2019-05-23

本文共 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/

你可能感兴趣的文章
强烈推荐:SiteServer CMS开源免费的企业级CMS系统!
查看>>
如何在 ASP.NET Core 中使用 NLog 的高级特性
查看>>
对CORS OPTIONS预检请求的一些思考
查看>>
.NET/C#程序开发中如何更优美地实现失败任务重试的逻辑?
查看>>
【Git】Git-常用命令备忘录(二)
查看>>
起点低,是彪悍的最好证明!
查看>>
「译」 .NET 5 新增的Http, Sockets, DNS 和 TLS 遥测
查看>>
如何在 ASP.NET Core 中 使用 功能开关
查看>>
微服务畅想录
查看>>
引入Jaeger——扩展
查看>>
ASP.NET Core Controller与IOC的羁绊
查看>>
【Git】Git-常用命令备忘录(三)
查看>>
前端数据层落地实践
查看>>
如何实现 ASP.NET Core WebApi 的版本化
查看>>
使用 dotnet-monitor 分析.NET 应用程序
查看>>
探索 .Net Core 的 SourceLink
查看>>
AgileConfig-如何使用AgileConfig.Client读取配置
查看>>
【gRPC】 在.Net core中使用gRPC
查看>>
整合.NET WebAPI和 Vuejs——在.NET单体应用中使用 Vuejs 和 ElementUI
查看>>
老人言:尽量用异步
查看>>