面向对象要解决的问题

提到面向对象,大家的第一反应就是封装、继承和多态。对其做如下解释:

  • 封装:影藏细节(A对A——将多行代码取个名字或A对B——API调用合作)
  • 继承:继承的意思就是同上跟上述一样,直接用另外一件事情的属性和方法,只需要写自己需要的属性和方法即可。
  • 多态:一个东西拥有两种或者多种东西的属性

因此,封装使我们减少沟通成本,也减少思维负担;继承可以让我们复用代码;而多态可以使一个东西更加灵活。

封装、继承、多态并不是面向对象终极需求,而是写代码的套路问题(定势思维)

封装和继承

JS中跟类对应的叫做构造函数

JS的七种数据类型:Number,String,bool,undefined,null,symbol(存的是值),object(复杂类型、引用类型、对象,存的是内存地址)。

而Object包括如下三种情形:

  1. 普通对象
  2. 数组
  3. 函数(重中之重)

原型链(对象与对象)

var 

如上定义一个obj,我们可以访问name和age,但是我们可以访问obj.toString(),那么toString方法来自哪里?在控制台使用console.dir()可以看到toString方法来自__proto__。

但是,在编程中,不要使用obj.__proto__来访问,这样访问会造成很多性能上的降低。

var 

问:若没有声明一个对象,则怎么访问__proto__呢?

window中有一个Object,使用window.Object可以得到,规定在window.Object中必须有一个protoType去存声明对象的__proto__的内存地址,因此可以通过window.Object.protoType得到跟声明对象中一致的__proto__

window

问:原型链只能有一个吗?怎么实现Array中有push,而Object中没有push呢?

Array的__proto__和Object的__proto__不一样。Array的__proto__中有push、pop等方法,而Array的__proto__的__proto__中有toString、valueOf等方法。如下图所示:

Array中的__proto__

因此obj.__proto__.__proto__被称作原型链。大写的Object是天生就有的,本身就有prototype属性的,而小写的object是声明的Object,必须声明之后才会有__proto__属性。

var 

JS没有类,只需要给每一个加一个__proto__属性就可以实现继承。

this(对象与函数)

函数是什么?
函数是一种可执行代码组成的对象。

为什么说函数就是对象呢? 函数的本质是字符串再加上一些其他的东西。

var 

var 

但是,我们还是觉得很智障,为什么要在写过之后还要传参进去?那么我们是否可以不传参数,访问该对象呢?按照obj.sayName()即可访问呢?那么问题来了。在上述的对象中sayName中是有参数的,为什么在调用的时候不需要传入了呢?因此,js引入了this表示自己。改造成如下:

var 

再看一个。

var 

函数是独立的东西,不是一个附属品,只接受一个输入,并且有一个输出。在不使用call的时候,this会隐式的传进去,则不能很快速明确的确定this的指代。JS中有两个参数,一个是this,另一个是arguments。显式的this则使用call调用,隐式的this则浏览器去猜。

从上述可以得出如下两个结论:

  1. 参数的值只有在传参的时候确定
  2. this是第一个参数 => 推断得出 this的值只有在传参的时候才能确定。

那么我们来看看如下的this都指代什么?

function 

再看看别的this的指代情况。

button

以上仅限于隐式调用时this指代的情况。若写为button.onclick.call(1),则此时的this为传入的参数。

为了解决this的事情,js引入了箭头函数,此时就算call也不会改变this的值。call的时候,this指代的都为外面的this。箭头函数中既没有this,也没有arguments。

函数和对象本来没有关系,通过隐式的this才会有了关系。若使用call,则this是明确的值,即为第一个传入的参数。

bind用法

bind用法

bind即为创建了一个新的函数,会call原先函数的参数,传入的参数则为this和arguments。

js bind 传参、_js中的面向对象(一)相关推荐

  1. js bind 传参、_Node.js 在企业中的应用实践集锦

    Node.js 在企业中的应用实践 在和一些 Nodeer 童鞋的分享交流过程中,也会听到一些声音:"Node.js 在企业中是如何应用的?有哪些大厂在实践?",于是公众号 &qu ...

  2. js bind 传参、_Node.js 在微医的应用场景及实践

    我是来自微医集团消费事业群的前端工程师高翔,这篇文章整理自我在<第一届缤纷前端技术沙龙>的主题分享<Node.js 在医疗行业的应用>,介绍了 Node.js 在微医的发展历程 ...

  3. url 编码 js url传参中文乱码解决方案

    前后台用js传参过程中,如果是中文就容易出现乱码,所以最好是先编码. 1.配置文件web.config中 在节中加上整个网站的编码方式.  <globalization fileEncoding ...

  4. JS函数传参时:值传递与引用传递的区别

    JS函数传参时:值传递与引用传递的区别 一.先分析基础数据与复杂数据的区别 : 基本数据类型:Undefined.Null.Boolean.Number.String 引用数据类型:对象 如:var ...

  5. 论JS函数传参时:值传递与引用传递的区别

    JS函数传参时:值传递与引用传递的区别? 值传递:值传递的数据为基本数据类型,基本数据类型在内存中存放的是数值本身:值传递为单向传递,只能由实参传递给形参. 引用传递:引用传递的数据为复杂数据类型,复 ...

  6. esp和ebp在传参过程中的变化和作用

    栈帧 esp和ebp在传参过程中的作用和连续:(12条消息) 函数调用过程中的栈帧结构及其变化_AC-NEWBIE的博客-CSDN博客_函数调用栈帧结构 从汇编角度深刻理解函数调用过程 (参数如何传递 ...

  7. pdf.js 请求传参关键词并高亮显示

    pdf.js 请求传参关键词并高亮显示 1.去官网下载: http://mozilla.github.io/pdf.js/getting_started/#download 2.将下载的包copy到s ...

  8. js onclick传参对象_js中onClick([object object])的传参问题。跪求!

    你的位置: 问答吧 -> JavaScript -> 问题详情 js中onClick([object object])的传参问题.跪求! 问题是这样的,看代码 for(var i=0;i ...

  9. js调java并传参_Js调用Java方法并互相传参的简单实例

    Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import ...

最新文章

  1. NHibernate和Cuyahoga(二)(翻译):
  2. 远程办公中的IT女性:工作量增加3倍,离职率却下降近50%
  3. 如何配置网络地址转换(NAT)—Vecloud微云
  4. C++ Primer 5th笔记(chap 14 重载运算和类型转换)标准库函数对象
  5. python硬件交互_Python操作系统库说明,pythonos,笔记
  6. metric learning -- 马氏距离与欧氏距离
  7. c语言putchar_C语言实现变色的心!连机器都会变心,呵,男人!
  8. Kubernetes 和 Docker,到底什么关系?
  9. linux系统查看磁盘信息
  10. 20145321 实验三实验报告
  11. 怎样永久关闭Win10自动更新_win10官网
  12. 《遥感原理与应用》第三版——思维导图
  13. ArcGIS for Desktop 10.2安装破解与使用图文详解
  14. 3分钟快速了解,如何一次通过CISSP考试?
  15. 关于数据分析岗位的工作思考
  16. 强网杯2021——wp
  17. 读文献——《Going deeper with convolutions》
  18. 30几个HTML5经典动画应用回顾 让你大饱眼福
  19. MAC地址和IP地址说明
  20. 《基于Python的大数据分析基础及实战》第一章

热门文章

  1. dismiss ios pop效果_iOS 动画框架pop使用方法
  2. 电脑屏保海底世界_世界上最后一个深海实验室,隐藏了人类未来的秘密
  3. linux 检测mysql链接_MySQL笔记
  4. IndexError: tensors used as indices must be long, byte or bool tensors
  5. Elsevier LaTeX时间-年份(author-year)两种引用格式
  6. python matplotlib画图改变图标题和坐标轴标题的字体大小
  7. Python计算信息熵
  8. 二隐层的神经网络实现MNIST数据集分类
  9. MFC空间几何变换之图像平移、镜像、旋转、缩放
  10. 国家信息安全公布:向日葵爆出执行漏洞,还有什么远程工具值得信赖?