js中如何使用工厂方式和构造函数创建对象

  • 构造函数也是一个普通函数,创建方式和普通函数一样

  • 不同:

构造函数首字母大写

构造函数的调用方式不同

function Person(){ }

如:

1)普通函数:

var per=Person()

2)构造函数(需要使用关键字来调用)

2.构造函数的执行流程

  • 1)立刻创建对象------ 一旦调用构造函数,立刻创建对象(因为使用new关键字,就如我们前面学习的,使用new会立刻在堆内存中开辟新的空间创建对象

  • 2)将新建的对象设置为函数中的this(因此在构造函数中,可以使用this来引用新建的对象)

在这里插入图片描述

在这里插入图片描述

最终

在这里插入图片描述

在这里插入图片描述

  • 3)逐行执行函数的代码

  • 4)将这个新建的对象作为返回值返回

总结:

  • 使用同一个构造函数创建的对象属于同一个类

  • 每个对象称为该类的实例

  • 使用(对象 instanceof 狗仔函数)可以检查obj是否为Person类的实例

如: per instanceof Person --true表示是,反之

使用new Object()方式区别不出来

但是!!!!

per instanceof Object----返回结果是true

Object相当于祖宗,因为所有对象都是它的后代

使用构造函数的存在的缺陷:

在这里插入图片描述

对于同功能的方法,完全可以使所有对象共享同一个方法(不用每次创建对象时都创建)

解决方法:

将这个函数提出到全局作用域中

在这里插入图片描述

同时,所有又同个构造方法创建的对象的方法都是指向了同一个全局的fun方法

在这里插入图片描述

好处:大大节省了空间与提高了性能

但是又引发了新的问题,即尽量不要在全局作用域中添加变量

  • (因为将函数定义在全局作用域中,污染了全局作用域的命名空间

  • 而且定义在全局作用域中不安全(因为开发往往不是一个人开发)

因此,引入新的解决方案

引入:

  • 我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype(对于函数)

1)这个属性对应一个对象,这个对象就是我们所谓的原型对象

在这里插入图片描述

2)如果函数作为普通函数调用prototype没有任何作用

3)当函数以构造函数的形式调用,它所创建的对象也会有一个隐含的属性--------该属性指向构造函数的原型对象(prototype)------我们可以通过__proto__访问到该属性

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

由同一个构造方法创建的对象的__proto__原型属性指向的是同一个对象

在这里插入图片描述

原型对象的作用


原型对象就相当于一个公开的区域,所有一个类的实例都可以反问到这个原型对象,因此我们可以将对象中共有的内容,统一设置在原型对象中,即可解决上面所说的全局函数的问题

在这里插入图片描述

在这里插入图片描述

注意:当我们访问对象的一个属性或者方法时,它会先在自身中寻找,有则直接使用;如果没有则会去原型对象中查找,找到则直接使用

在这里插入图片描述

向原型中添加函数同理,这样便解决上述的定义全局函数污染变量命名空间的问题,如下定义

在这里插入图片描述

总结:

以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数中!这样不用为每一个对象添加,也不会影响全局作用域,就可以使每个对象都具有这个属性和方法了


在这里插入图片描述

ps:使用in检查对象中是否含有某个属性时,如果对象中没有,但是原型中有。也会返回true,

因此检查自身是否有,不能用in

使用:对象的hasOwnPropery()来检查自身是否含有该属性

在这里插入图片描述

如 mc.hasOwnPropery(“name”)

这里说明以下:hasOwnPropery()是原型对象中的,那么疑问。我既没有使用

a.__proto__hasOwnPropery,也没有使用MyClass.prototype,那么hasOwnPropery从哪里来呢?其实原型对象也是一个对象,那么是对象那就会存在原型属性。

没错!hasOwnPropery从原型对象中的原型属性中来!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值