1.面向对象:是一种注重结果的思维方式

2.面向对象三大特征: 封装 、 继承 、 多态

(1).封装 : 把代码放入对象的方法中

(2)继承 : 一个对象 拥有 另一个对象 所有的成员

(3)多态 : 一个对象 在不同情况下的不同状态(* js语言基本不涉及多态)

继承:一个对象 拥有另一个对象的所有成员

原形继承:吧父对象 作为子对象构造函数的原形

例子:

//父对象let father = {house:{address : '深圳湾一号',price: 20000000},car:{brand : '劳斯莱斯幻影',price:15000000}}//子对象//构造函数function Son(name,age){this.name = namethis.age = age}//原型继承: 把父对象 作为子对象构造函数的原型Son.prototype = father//可选 : 原型继承之后,由于父对象覆盖原来的 子对象构造函数原型, 就会导致constructor消失.//解决办法: 手动添加。(对开发几乎没有影响,也可以不加)Son.prototype.constructor = Son//实例对象let s1 = new Son('ikun',30)let s2 = new Son('班长',20)console.log(s1,s2)

原形链:

1.原型链 : 每一个对象都有自己的原型, 而原型也是对象,也会有自己的原型,此次类推形成链式结构。称之为原型链。(原型链的终点是null)

2.对象访问原型链规则 : 就近原则

* 对象先访问自己的,自己没有就找原型的,原型没有就找原型的原型,一直到原型链终点null.如果还找不到。 属性则获取undefined, 方法则会报错 xxx is not function

3.经典面试题

(1)原形链作用 : 继承

(2)js如何实现面向对象继承:原形链

原形链流程图

所有构造函数都是Function的实例,所有原型对象都是Object的实例除了Object.prototype

内置对象原型链

 // 数组对象  //实例化对象let arr = [10,20,30]//new Array(10,20,30)console.log( arr )//1.1 查看arr的原型console.log( arr.__proto__.constructor )//Arrayconsole.log( arr.__proto__ === Array.prototype )//true//1.2 查看arr的原型的原型console.log( arr.__proto__.__proto__.constructor )//Objectconsole.log( arr.__proto__.__proto__ === Object.prototype )//true// 字符串对象let str = new String('abc')console.log( str )//2.1 查看str的原型console.log( str.__proto__.constructor )//Stringconsole.log( str.__proto__ === String.prototype )//true//2.2 查看arr的原型的原型console.log( str.__proto__.__proto__.constructor )//Objectconsole.log( str.__proto__.__proto__ === Object.prototype )//true// 日期对象let date = new Date()/* js有几个特殊的对象 无法使用 log来打印的,需要用dir来打印: function date dom对象 */console.dir( date )//3.1 查看date的原型console.log( date.__proto__.constructor )//Dateconsole.log( date.__proto__ === Date.prototype )//true//3.2 查看date的原型的原型console.log( date.__proto__.__proto__.constructor )//Objectconsole.log( date.__proto__.__proto__ === Object.prototype )//true

DOM对象原型链

1. instanceof(关键字): 运算符

用于检测 构造函数的prototype在不在实例对象的原型链中(说人话: 亲子鉴定,鉴定两个对象之间有没有血缘关系)

2. 写法:实例对象 instanceof 构造函数

instanceof原理: (面试题)

检测 右边构造函数的prototype 在不在 左边实例对象的原型链中

3. 应用 : 某些函数为了限制你的数据类型,在内部需要用instanceof进行判断是否是正确的数据类型

例子:

let arr = [10,20,30]// arr-> Array.prototype -> Object.prototype -> nullconsole.log( arr instanceof Array )//trueconsole.log( arr instanceof Object )//trueconsole.log( arr instanceof String )//false//封装一个函数,要求这个函数必须要传数组类型、 传其他类型不可以function fn(arr){if( arr instanceof Array){console.log( arr.reverse() )}else{console.log('数据类型错误')}}fn( [10,20,30] )fn( 'abc' )

原型链应用:封装提示框案例

  <script>// 构造函数function Modal(title, url) {this.title = titlethis.url = urlthis.modalBox = `<div class="modal"><div class="header">${title} <i>x</i></div><div class="footer"><img src="${url}" alt="" width="100%"></div></div>`}// 对象Modal.prototype.open=function(){// 创建divlet div = document.createElement('div')// 设置标签内容div.innerHTML = this.modalBox// 添加到页面document.body.appendChild(div)// 给关闭按钮注册事件div.querySelector('.modal i').addEventListener('click',function(){div.remove()})}// 实例对象document.querySelector('#btn1').addEventListener('click',function(){let m1 = new Modal('提示信息', './111.jpg')m1.open()console.log(m1)})document.querySelector('#btn2').addEventListener('click',function(){let m2 = new Modal('提示信息', './222.jpg')m2.open()})document.querySelector('#btn3').addEventListener('click',function(){let m3 = new Modal('提示信息', './333.jpg')m3.open()})</script>

函数补充

1: arguments关键字: 获取函数所有的 实参,是一个伪数组 : 有数组三要素(元素、下标、长度),但是不能使用数组的方法。

(1)应用 : 一般用户参数数量不限的函数.

(2)例如: arr.push() Math.max() 这些函数实参数量不限,底层原理就是使用arguments来接收所有的实参

2: 剩余参数(rest参数) :  获取函数剩余的所有实参

(1)语法: function 函数名(形参1,...形参2){}

(2) rest参数是真数组

(3)注意点:剩余参数必须写在最后一个形参位置

3:rest参数在一般情况下,可以替代arguments

4: 函数默认参数:function 函数名(形参=默认值){ }

例子:

       function fn(a=10,b=20){ //实参有数据则是实惨的数据 实参没有数据则是=后面的数据console.log(a) //5console.log(b) //20console.log(a+b) //25}fn(5)

for-in与for-of区别(面试题)

1.功能不同

for-in是遍历数组的下标

for-of是遍历数组的元素

2.原型的属性

for-in会遍历原型的属性

for-of不会遍历原型的属性

3.数据类型

for-in可以遍历Object类型

for-of不可以遍历Object类型

总结:如果只想要属性值/元素,使用for-of效率更高

例子:

        let arr = [10,20,30]console.log(arr)//给数组原型添加属性Array.prototype.age = 66let obj = {name:'张三',age:20,sex:'男'}//1.for-in循环for(let key in arr){console.log( key )//下标console.log( arr[key] )//元素  }//2. for-of循环for(let item of obj ){console.log( item )//元素 }

变量声明let与var

1. ES5声明变量特点: var

(1)有变量提升 : var声明提升到当前作用域最顶端

(2)没有块级作用域 : 大括号(分支+循环)里面的变量是全局的

2. ES6声明变量特点: let const

(1) 没有变量提升 : 变量必须要先声明,后使用

(2) 有块级作用域 : 大括号(分支+循环)里面的变量是局部的

3. let与const区别 :

let 变量 : 值可以修改的

const 常量 : 值不可以修改, 只能在声明的时候赋值

JavaScript 原形链相关推荐

  1. 对javascript作用域链的理解

    这几天学习了一下javascript作用域链,感到这个挺重要的,所以写一篇文章分享一下: 1. 作用域链: 当代码在一个环境中执行时,会创建由变量对象构成的一个作用域链.作用域链的用途是:保证对执行环 ...

  2. javascript原型链中 this 的指向

    为了弄清楚Javascript原型链中的this指向问题,我写了个代码来测试: var d = {d: 40};var a = {x: 10,calculate: function (z) {retu ...

  3. 扩展数组方法 给数组原形链追加方法(原型链中的this)

    扩展数组方法 写在前面 1.关于原型链 1.1 故事的开始,手写index 1.2 故事的矛盾点,数组方法直接给Array原形扩展方法 1.3 又一次悟到了原形链 1.4 故事的高潮,发现问题,返现没 ...

  4. 深度解析JavaScript原型链

    深度解析JavaScript原型链 文章目录 深度解析JavaScript原型链 前言 JavaScript原型链,这里只分享我自己的见解 一.原型链是什么 二.心得 三图解 总结 前言 JavaSc ...

  5. JavaScript原型链污染攻击

    前言 最近在看js的时候看到p神的一篇关于js原型链污染的文章,学习一下. 下面转自p神:深入理解 JavaScript Prototype 污染攻击 还有一篇案例关于js原型链污染的ctf题:从一道 ...

  6. JavaScript 原型链和继承面试题

    JavaScript 原型链和继承问题 JavaScript 中没有类的概念的,主要通过原型链来实现继承.通常情况下,继承意味着复制操作,然而 JavaScript默认并不会复制对象的属性,相反,Ja ...

  7. JavaScript 原型链常用方法

    JavaScript 原型链常用方法 对象属性类型 数据属性 Configurable(表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性) En ...

  8. 技术分享经典 javaScript原型链面试题

    技术分享 javaScript原型链 一个小题目 前置知识 变量提升和函数提升 this指针的指向 原型链是什么 new操作符的工资流程 一个小题目 今天我们部门的技术分享上出现了这样一段代码: fu ...

  9. 如何理解JavaScript原型链

    如何理解JavaScript原型链 实例对象与原型对象的关系 构造函数.原型对象和实例对象之间的关系 原型链结构图 函数在原型链中的结构 原型链的理解和总结 实例对象与原型对象的关系 构造函数.原型对 ...

  10. JavaScript原型链以及Object,Function之间的关系

    JavaScript里任何东西都是对象,任何一个对象内部都有另一个对象叫__proto__,即原型,它可以包含任何东西让对象继承.当然__proto__本身也是一个对象,它自己也有自己的__proto ...

最新文章

  1. nginx安全日志分析脚本的编写
  2. 微服务架构中的雪崩问题产生原因及解决办法
  3. 回顾 | Kubernetes SIG-Cloud-Provider-Alibaba 首次网研会(含 PPT 下载)
  4. FZU - 2202 犯罪嫌疑人(逻辑思维+简单模拟)
  5. 视图中::text_新CalendarFX视图:MonthGridView!
  6. 隐私和网络安全将是未来科技发展的屏障
  7. c语言求树上节点的双亲,用非递归算法求二叉树叶子结点的c语言代码怎样写?...
  8. mysql完全手册阅读笔记
  9. Remoting疑惑续集之再续
  10. android studio 项目源码_这个标星 2.3k+ 的项目带你 Android 源码分析从入门到放弃...
  11. 解决IOS 原生项目加载html上下可滑动
  12. 大话一些大二层网络技术新兴术语,并总结它与OpenStack的关系 (by quqi99)
  13. ZXP个人美工作品---->
  14. CAXA 分解命令x 解决不能选中图形问题。
  15. Android科大讯飞语音合成
  16. Vue前端技术知识整理
  17. ubuntu终端英文乱码问题
  18. html标签中写onclick,HTML a 标签添加 onclick()事件的几种方式
  19. 支付宝APP支付集成文档
  20. 那些黑科技感爆棚的可视化大屏,是怎么做出来的?模板直接套用

热门文章

  1. unity 简易的小地图导航
  2. 对本课程的期望以及教学建议
  3. java编写小游戏大球吃小球
  4. 网线百兆与千兆的接法
  5. linux终端重命名文件夹命令,如何使用命令行轻松重命名文件?
  6. Coursera machine learning week 6 excise
  7. 智能电话机器人--基于 UniMRCP 实现讯飞 ASR MRCP Server
  8. 录制App操作生成Gif动态图教程(Android)
  9. 基于redis幂等机制,保证优惠券不会重复发放-13
  10. Ubuntu18.04开机自动开启小键盘