当前位置: 首页 > news >正文

【前端】JavaScript构造函数

文章目录

    • 概念
    • 执行过程
    • 返回值
    • 原型与constructor
    • 继承方式
      • 原型链
      • 其他继承方式(还没写)
    • 参考

概念

在JS中,通过new实例化对象的函数叫构造函数。实例化对象,也就是初始化一个实例对象。构造函数一般首字母大写。

构造函数的目的:创建对象。

创建对象有两种方法:

  • 构造函数+prototype
  • class

这里我们只讲前者。

执行过程

构造函数的执行过程其实是new操作符的基本过程。

过程

  • 创建一个新对象,在内存中创建一个新地址
  • 继承原型
  • 改变构造函数的this指向,指向新创建的对象
  • 新对象添加构造函数的属性和方法
  • 根据构造函数的返回类型作判断,若是原始值则忽略,若是返回对象则正常处理

举例说明:

有构造函数Person:

function Person(name, age) {this.name = name;this.age = age;
}

用new创建对象:

let p1 = new Person('kitty', 1);

执行的过程(供理解,真实情况应该更复杂):

function Person(name, age) {// 在内存中创建新地址let p1 = {};// 继承原型p1.proto = Person.prototype// 改变构造函数this的指向,添加属性和方法this.name = name;this.age = age;// 返回thisreturn this
}

返回值

构造函数中,不要显示地返回任何值

若构造函数返回值为原始值:还是返回实例对象。

function Person(name) {this.name = name;return 'a'
}let p1 = new Person('Kitty');
console.log(p1) //Person { name: 'Kitty' }

若构造函数返回值为对象:返回的是构造函数return的对象,而不是Person对象

function Person(name) {this.name = name;return {name:'suga'}
}let p1 = new Person('Kitty');
console.log(p1) //{ name: 'suga' }
console.log(p1 instanceof Person)//false

原型与constructor

函数的原型与对象的原型:看这里【JavaScript高级】原型和继承相关:原型对象、函数原型、原型链和继承、继承的优化、对象判断相关方法

new 构造函数来创建对象后,创建出来的对象实例的proto属性会指向构造函数的prototype

function Person() {}
var p1 = new Person()// 上面操作相当于会进行如下的操作
p1.__proto__ = Person.prototype

constructor:函数的原型对象上的属性constructor会指向当前的函数对象。

即:

Person.prototype.constructor===Person //true

在这里插入图片描述

继承方式

原型链

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会通过它的__proto__隐式属性,找到它的构造函数的原型对象,如果还没有找到就会再在其构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链

  • Parent是父构造函数,Child是子构造函数
  • Child.prototype = new Parent(),子构造函数的原型为父构造函数的实例,相当于继承了父构造函数
  • 想要调用child的getName(),但它本身没有这个方法,于是在 它的原型 上找
function Parent() {this.name = 'a'
}Parent.prototype.getName = function () {console.log(this.name)
}function Child() { }//重点
Child.prototype = new Parent()var child = new Child()console.log(child.getName())//a

缺点:

  • 引用类型的所有属性都被实例共享
  • 创建Child实例的时候无法向Parent传参

其他继承方式(还没写)

参考

JS——构造函数_前端魔法师的博客-CSDN博客_js构造函数写法

js的构造函数理解_laviniatu的博客-CSDN博客_构造函数js

JS中构造函数的原型prototype_吗吗哈哈的博客-CSDN博客_js构造函数的prototype

【JavaScript高级】原型和继承相关:原型对象、函数原型、原型链和继承、继承的优化、对象判断相关方法_karshey的博客-CSDN博客

一文搞懂JS原型与原型链(超详细,建议收藏) - 掘金 (juejin.cn)

http://www.lryc.cn/news/21192.html

相关文章:

  • STM32单片机之温湿度检测系统(DTH11、OLED、LCD1602)
  • vitepress 就这几步操作,博客就搭好啦?
  • 【Python工具篇】Anaconda中安装python2和python3以及在pycharm中使用
  • Android 网络框架——Retrofit源码精析
  • 分布式算法 - Snowflake算法
  • 【java web篇】Maven的基本使用以及IDEA 配置Maven
  • 【蓝桥集训】第七天并查集
  • 【Playwright】扑面而来的Playwright测试框架
  • React(三) ——新、旧生命周期
  • IT男的一次中年破局尝试--出书
  • Python 内置函数eval()
  • 【ArcGIS Pro二次开发】系列学习笔记,持续更新,记得收藏
  • EasyRecovery16MAC苹果版本Photo最新版数据恢复软件
  • Go的string与strings.Builder
  • 8.Spring Security 权限控制
  • curl / python+selenium爬取网页信息
  • 晶体塑性有限元 Abaqus 三维泰森多边形(voronoi模型)插件 V7.0
  • CPython解释器性能分析与优化
  • Linux 进程:理解进程和pcb
  • 银行数字化转型导师坚鹏:招商银行数字化转型战略研究
  • java 一文讲透面向对象 (20万字博文)
  • 使用file-selector-button美化原生文件上传
  • 0402换元积分法-不定积分
  • 信号类型(雷达)——脉冲雷达(三)
  • 并查集(13张图解)--擒贼先擒王
  • Flutter3引用原生播放器-IOS(Swift)篇
  • 【蓝桥杯每日一题】双指针算法
  • 拼数(一般贪心)
  • LeetCode 热题 C++ 169. 多数元素 10. 正则表达式匹配 155. 最小栈
  • Clickhouse学习:MergeTree