2、new关键字、继承、堆栈、深拷贝、浅拷贝

一、new关键字的底层原理

1、new关键字的作用

  • 实例化一个对象返回一个新对象
  • 让构造函数中的this指向实例化对象

2、new关键字的底层原型、

  • var p1 = {} 创建了新对象,开辟内存空间
  • Person.call(p1)通过call方法改变函数Person中的this指向,指向实例兑现p1
  • p1.__proto__==Person.prototype p1的指针指向构造函数原型,地址相同,属性和方法都能继承

二、原型的指向是否可以改变

function Animal() { }
Animal.prototype.name = "小狗"function Dog() { }
Dog.prototype.coloe = "金毛"
Dog.prototype = new Animal()console.log(Animal.prototype.constructor == Animal)//true
console.log(Dog.prototype.constructor == Dog);//false
console.log(Dog.prototype.constructor == Animal);//true

三、3种继承

  • 原型继承、构造方法继承(call方法继承)、拷贝继承

1、原型继承

  • 目的:让学生对象(子类)继承人对象(父类)的属性和方法,相当于继承人对象的构造函数和原型中的属性和方法
//1、人的构造函数
function Person(name){this.name = namethis.work = function () {console.log(this.name + "热爱工作")}
}
//2、人的原型
Person.prototype.age = 26
Person.prototype.playCode = function (){console.log(this.name + "喜欢敲代码")
}
//3、学生的构造函数
function Student(sex) {this.sex = sexthis.eat = function () {console.log(this.name + "喜欢吃零食")}
}
//----------------必须要写在子类的原型的上面-----------------
Student.prototype = new Person("小明")//4、学生的原型
Student.prototype.className = "web前端"
Student.prototype.learn = function () {console.log(this.name + "喜欢学习")
}
//
console.log(Student.prototype.constructor == Preson)//true
var stu = new Student("男生")//1、学生构造函数中的属性和方法
console.log(stu.sex)//男生
stu.eat()//小明喜欢吃零食
//2、学生原型中的属性和方法
console.log(stu.className)//web前端
stu.learn()//小明喜欢学习
// 3、人构造函数中的属性和方法
console.log(stu.name)//小明
stu.work()//小明热爱工作
// 4、人原型中的属性和方法
console.log(stu.age)//26
stu.playCode()//小明喜欢敲代码

2、构造继承(call方法继承)

//1、人的构造函数
function Person(name, age) {this.name = namethis.age = agethis.work = function () {console.log(this.name + "热爱工作")}
}
//2、人的原型
Person.prototype.sex = "男生"
Person.prototype.basketball = function () {console.log(this.name + "喜欢打篮球")
}
//3、学生的构造函数
//---------注意----------------
function Student(score, x, y) {this.score = scorethis.study = function () {console.log(this.name + "喜欢学习")}
//---------注意----------------Person.call(this, x, y)
}
Student.prototype = new Person()
//4、学生的原型
Student.prototype.className = "web31"
Student.prototype.playCode = function () {console.log(this.name + "喜欢敲代码");
}
//---------注意----------------
var stu = new Student(100, "小花", 18)
// var p1 = new Person("小花",18)// 1、学生构造函数中的属性和方法
console.log(stu.score)
stu.study(
// 2、学生原型中的属性和方法
console.log(stu.className)
stu.playCode()
// 3、人员构造函数中的属性和方法
console.log(stu.name)
console.log(stu.age)
stu.work()
// 4、人员原型中的属性和方法
console.log(stu.sex)
stu.basketball()

3、拷贝继承

//人的构造函数
function Person(name) {this.name = namethis.work = function () {console.log(this.name + "热爱工作");}
}
//人的原型
Person.prototype.age = 26
Person.prototype.code = function () {console.log(this.name + "喜欢敲代码");
}
//学生的构造函数
function Student(sex) {this.sex = sexthis.eat = function () {console.log(this.name + "喜欢吃零食")}
}
//学生的原型
Student.prototype.className = "web前端"
Student.prototype.study = function () {console.log(this.name + "喜欢学习");
}var stu = new Student("男生")
var p = new Person("小明")
//-------------主要代码主要代码----------
for (x in p) {stu[x] = p[x]
}// 1、学生构造函数中的属性和方法
console.log(stu.sex)//男生
stu.eat()//小明喜欢吃零食
// 2、学生原型中的属性和方法
console.log(stu.className)//web前端
stu.study()//小明喜欢学习
// 3、人员构造函数中的属性和方法
console.log(p.name);//小明
p.work()//小明热爱工作
// 4、人员原型中的属性和方法
console.log(p.age);//26
p.code()//小明喜欢敲代码

四、堆栈

JavaScript的变量存储方式:栈(stack)和堆(heap)

  • 1、栈:自动分配内存空间,系统自动释放,里面存放的是基本类型和引用类型的地址

  • 2、堆:动态分配的内存,大小也不定,也不会自动释放。里面存放引用类型的值

    image-20240222154456005

五、深拷贝与浅拷贝(引用类型)

  • 基本类型:简单的数据段—栈 传值
  • 引用类型:可能有多个值 传址
    地址(引用、指针)—栈
    值—堆
    栈中的地址指向堆中的值

1、浅拷贝

  • 会影响原来的值

数组的浅拷贝

var arr1 = [1,2,3]
var arr2 = arr1
console.log(arr2)//[1,2,3]
arr2.push(4)
console.log(arr2)//[1,2,3,4]
console.log(arr1)//[1,2,3,4]

对象的浅拷贝

var obj1 = {name: "小明",age: 18,
}
var obj2 = obj1
obj2.sex = "男生"
console.log(obj2);//{name: '小明', age: 18, sex: '男生'}
console.log(obj1);//{name: '小明', age: 18, sex: '男生'}

2、深拷贝

  • 不会影响原来的值

数组的深拷贝

// 1、for循环
var arr3 = [1,2,3]
var arr4 = []
for(var i = 0;i < arr3.length; i++){arr4.push(arr3[i])
}
console.log(arr4)//[1,2,3]
arr4.push(4)
console.log(arr4)//[1,2,3,4]
console.log(arr3)//[1,2,3]
//2、slice
var arr1 = [1,2,3]
var arr2 = arr1.slice(0)
arr2.push(5)
console.log(arr2);//[1,2,3,5]
console.log(arr1);//[1,2,3]
//3、concat()
var arr1 = [1,2,3]
var arr2 = arr1.concat()
console.log(arr2)//[1,2,3]
arr2.push(6)
console.log(arr2)[1,2,3,6]
console.log(arr1)[1,2,3]

对象的深拷贝

//1、for循环
var obj1 = {x: 1,y: 2,
}
var obj2 ={ }
for(x in obj1) {obj2[x] = obj1[x]
}
console.log(obj2);//{x: 1, y: 2}
obj2.z = 3
console.log(obj2);//{x: 1, y: 2, z: 3}
console.log(obj1)//{x: 1, y: 2}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/486553.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第49天|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

文章目录 121. 买卖股票的最佳时机思路代码 122.买卖股票的最佳时机II思路代码 121. 买卖股票的最佳时机 题目链接&#xff1a;121. 买卖股票的最佳时机 文章讲解&#xff1a;代码随想录|121. 买卖股票的最佳时机 视频讲解&#xff1a;121. 买卖股票的最佳时机 思路 要计算第i…

cleanmymacx怎么清理 cleanmymac破解版怎么安装

CleanMyMac X是一款颇受欢迎的专业清理软件&#xff0c;拥有十多项强大的功能&#xff0c;可以进行系统清理、清空废纸篓、清除大旧型文件、程序卸载、除恶意软件、系统维护等等&#xff0c;并且这款清理软件操作简易&#xff0c;非常好上手&#xff0c;特别适用于那些刚入手苹…

构建生物医学知识图谱from zero to hero (3):生物医学命名实体识别和链接

生物医学实体链接 🤓现在是激动人心的部分。对于NLP和命名实体识别和链接的新手,让我们从一些基础知识开始。命名实体识别技术用于检测文本中的相关实体或概念。例如,在生物医学领域,我们希望在文本中识别各种基因、药物、疾病和其他概念。 生物医学概念提取 在这个例子中…

外包干了两个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

智能科技助力服装业:商品计划管理系统的革命性变革

随着智能科技的飞速发展&#xff0c;服装行业正在经历前所未有的变革。在这股浪潮中&#xff0c;商品计划管理系统的智能化转型成为了行业的核心驱动力。这种变革不仅极大地提高了服装企业的运营效率和市场竞争力&#xff0c;更为整个行业的可持续发展注入了新的活力。 智能商…

二十一、图像旋转

项目功能实现&#xff1a;对一张图像进行旋转完全显示&#xff0c;且空白区域用绿色填充 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 rotating.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class ROTATING { public:void rotat…

2/23作业

1.loop_list.c #include "loop_list.h" //创建单向循环链表 loop_p creat_loop_list() { loop_p K (loop_p)malloc(sizeof(loop_list)); if(KNULL) { printf("空间申请成功\n"); } K->len0; K->nextK; return…

2024网络安全人才春招正式启动(附面试真题)

新年新气象&#xff01;新的网安春招即将开始~ 话不多说&#xff0c;在此先给大家送上一份新年礼物《春招安全研究岗位面经分享》&#xff0c;祝各位都能找到满意的工作&#xff01; CSDN大礼包&#xff1a;《黑客&网络安全入门&进阶学习资源包》免费分享 安恒卫兵实…

外包干了3个月,技术退步明显

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

产品渲染3D效果图一张多少钱,哪个平台更有性价比?

产品渲染3D效果图的价格受到多方面因素的影响&#xff0c;包括但不限于产品类型、渲染难度以及输出尺寸等。如果效果图需要后期处理&#xff0c;还有可能增加其他费用。接下来&#xff0c;我们来了解一下产品渲染效果图的费用情况。 1.产品渲染3D效果图一张多少钱&#xff1f; …

Canal + Kafka 同步 MySQL 数据到 Redis

解决缓存和数据库一致性问题 一般来说&#xff0c;缓存中的数据没什么问题&#xff0c;但是数据库更新后&#xff0c;就容易出现缓存&#xff08;Redis&#xff09;和数据库&#xff08;MySQL&#xff09;间的数据一致性问题。由于写和读是并发的&#xff0c;没法保证顺序&…

openEuler安装MySQL客户端、openEuler安装MySQL-client、openEuler部署MySQL-client

MySQL客户端下载链接&#xff1a;https://downloads.mysql.com/archives/community/ mysql-community-client-5.7.30-1.el7.x86_64.rpm mysql-community-common-5.7.30-1.el7.x86_64.rpm mysql-community-libs-5.7.30-1.el7.x86_64.rpm 3个必选 8.0.22以上的版本是4个&…