热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JS基础入门篇(三十五)—面向对象(二)

如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的JS基础入门篇(三十四)—面向对象(一)????1.非

如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的
JS基础入门篇(三十四)—面向对象(一)????

1.非常非常重要而又简单的概念—原型链

想要以下为 f 添加一个say方法,有三种方法。

方法一:相当于添加一个自定义属性,此属性是一个方法。

方法二:为构造函数.prototype添加一个say方法。

方法三:为Object.prototype添加一个say方法。

疑问?️:方法二中挂在构造函数的方法,和方法三中挂在Object的方法, f 为什么能查找的到???

解析(此解析一定要看懂,没有看懂多看几遍或者百度下):
是原型链的概念。就是js内部的查找机制。首先要明白:

1.prototype 原型

当一个函数被申明的时候,该函数下默认有一个属性:prototype,该属性的值是一个对象。

举例说明:

结果如图所示:
图片描述

2.__proto__

当一个对象被创建的时候,该对象会自动被添加上一个属性:__proto__,他的值也是一个对象,并且该属性 就是 当前这个对象的构造函数的prototype

举例说明:

结果如图所示:
图片描述

3.对象.__proto__ === 构造函数.prototype

举例说明


结果如图所示:
图片描述

所以查找机制为:
调用f.say( );时

if( 对象 f上面是否say方法 ){//为真,执行if内部的代码则调用f上面的say方法
}else if(Fn.prototype是否有say方法){//为真,执行else if内部的代码第一步:f.__proto__ === Fn.prototype由这个查找到f对应的构造函数的原型,即为 Fn.prototype。第二步:查看Fn.prototype是否有say方法,有的话,则调用Fn.prototype是上面的say方法。}else if( Object.prototype是否有say方法 ){第一步:Fn.prototype.__proto__ === Object.prototype由这个查找到Fn.prototype对应的构造函数的原型,即为 Object.prototype。第二步:Object.prototype是否有say方法,有的话,则调用Object.prototype是上面的say方法。}else{//如果以上都没有say方法 会报错。
}

举例说明

2.hasOwnProperty, constructor, instanceof

1.hasOwnPropert ???

作用用来判断某个对象是否含有 指定的 自身属性语法boolean object.hasOwnProperty(prop)参数object要检测的对象prop要检测的属性名称。注意:不会沿着原型链查找属性,只查找自身属性

如果以上文字都看不懂,可以先看例子,再看文字。

2.constructor ???

函数的原型prototype的值是一个对象,初始化会有一个属性为constructor,对应的值为拥有这个原型的函数注意:prototype的值是可以修改的,修改了prototype的值,要手动将constructor指向函数

3.instanceof???

instanceof是一个二元运算符,返回布尔值
运算检测 一个 对象原型 是否 在要检测的对象的原型链上使用:object instanceof constructor

3.this的指向

1.谁调用就指向谁。
2.谁触发就指向谁。
举例说明1

举例说明2

4.修改this指向的三种方式

1.call

1. 函数**`会`**立刻执行
2. 函数执行时候,函数**`第一个参数`**是内部的**`this指向`**
3. **`第一个参数之后的参数,都是指 函数执行时候 ,内部的实参`**

直接撸代码,举例说明

2.bind

1. 函数**`不会`**立刻执行
2. 函数执行时候,**函数第一个参数是内部的this指向**
3. **第一个参数之后的参数,都是指 函数执行时候 ,内部的实参**
4. **`返回的是 修改了 this指向的新函数`**与call的区别就是函数不会立刻执行。

举例说明

3.apply

与call很相似,只是第二个参数值接受数组

举例说明


5.数组的检测

因为由typeof打印出来,数组和对象的结果都是object。有时候我们需要判断变量是否是数组

方法一:

var arr = [1,2,3];console.log( arr.toString() );//1,2,3Array.prototype.toString = Object.prototype.toString;//重新赋值Array.prototype.toString的方法。但是下次在别的情况调用Array.prototype.toString,此方法已被重新覆盖。所以不太好console.log( arr.toString() );//[object Array]

var arr = [1,2,3];

console.log( Object.prototype.toString.call(arr) );

// 使用 Object.prototype.toString
// 同时 修改内部的this指向 arr

console.log( arr );//[object Array]

方法二:

6.继承

继承
在Javascript中,继承就是让一个对象(子类)拥有另一个对象(父类)的属性/方法(还有原型上的属性和方法)。其中原则就是:

1.子类的修改不能影响父类
2.子类可以 在 父类 基础上 添加自己的属性 和 方法

1.通过prototype 赋值 (行不通,但是还是要看行不通的原因)

举例说明:上代码

2.原型链继承

子类的原型 = 父类的实例注意 : 在为 子类 原型 赋值的时候去修正 constructor弊端 : 子类构造函数内的地址的修改会修改其他子类。因为所有子类构造函数的原型共享一个实例。

举例说明

对原型链继承遇到问题的解决的方案一:

改为:

function Coder() {this.arr=[1,2,3];//这样查找的时候,对象上面就有了,不会查找到上一层,既不会修改到。
}

解析:此方法麻烦,如果父类有很多自定义属性都是对象或者方法,那么子类都要重新复制一遍。

对原型链继承遇到问题的解决的方案二:

借用构造函数在子类中执行父类的构造函数修改子类构造函数中的 this指向只能继承父类构造函数中的方法和属性继承不到父类构造函数原型链中的方法和属性

改为:

function Coder() {CreatPerson.call(this);// // 此处的 this 指的 是 Coder 的 实例}

总结:通过原型链继承的正确写法。

提醒自己: Coder.prototype.constructor=Coder;//在为 子类 原型 赋值的时候去修正 constructor。 不要忘记修正子类的constructor。

3.拷贝式继承

1. 完成拷贝式继承首先要知道如何拷贝对象。所以先来拷贝对象


2.拷贝继承




推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 热血合击脚本辅助工具及随机数生成器源码分享
    本文分享了一个热血合击脚本辅助工具及随机数生成器源码。游戏脚本能够实现类似真实玩家的操作,但信息量有限且操作不可控。热血合击脚本辅助工具可以帮助玩家自动刷图、换图拉怪等操作,并提供了雷电云手机的扩展服务。此外,还介绍了使用mt_rand函数作为随机数生成器的代码示例。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
author-avatar
文静的疯子19__97
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有