构造函数与实例化之间的关系和原型的引入

简介: 构造函数与实例化之间的关系和原型的引入

我对构造函数与实例化之间的理解


当我们的编程是面向对象的时候,


先是抽象的过程=>然后实例化的过程


比如我们抽象一个人,我知道一个人的基本信息。


名称,年龄,性别,....等等


我们把先是抽象的,在抽象完成后,我们在实例化。


构造函数与实例化之间的关系?


//这个自定义的构造函数在抽象
function Person(name,age,sex){
    this.name=name;
    this.age=age;
    this.sex=sex;
    this.say=function(){
        console.log("我叫",name)
    }
}
// 这个过程是实例化
let per1=new Person('司藤',300,'女');
per1.say();//调用
//let per1=new Person('司藤',300,'女');


通过上面这一行代码。


我们可以得出一个结论:


构造函数与实例对象之间的关系是:


实例对象需要通过构造函数来创建的。


同时:我们可以知道实例对象的构造器就是构造函数


我们来证明这一句话是否正确;上面的代码不改变。


console.log( per1.constructor===Person ) //返回的是true


充分说明:实例对象的构造器就是构造函数这一句话是正确的。


per1.say是否等于per2.say


function Person(name,age,like) {
    this.name=name;
    this.age=age;
    this.like=like;
    this.say=function(){
        console.log('我可以不吃饭');
    }
}
var per1=new Person("司藤",300,'耍');
var per2=new Person('白浅','10000','耍');
per1.say();
per2.say();
console.log( per1.say==per2.say ) //false


per1.say不等于per2.say得出的结论


因为console.log( per1.say==per2.say ) //false


我们可以得出一个结论。


那就是per1.say()和per2.say()调用的不是同一个方法


那么他们的内容是否是相等的的呢?


console.log( per1.say()==per2.say() ) //true


说明内容是相等的


康康下面这一段代码出现的问题


function Person(name,age,like) {
    this.name=name;
    this.age=age;
    this.like=like;
    this.say=function(){
        console.log('我可以不吃饭');
    }
};
for (var index = 0; index < 100; index++) {
    var per=new Person("司藤",300,'耍');
    per.say();
}


这一段代码是它在内存中开辟了100个空间。


每个空间都有一个say方法。


但是每一个say方法都是不同的。可是他们输出的内容是相同。


或者说执行的逻辑是相同的。


这样就造成了空间浪费。


所以在项目中,这样就造成了浪费空间。


我们可不可以来优化呢 ?


优化代码解决造成空间浪费


function comSay(){
    // 执行相同的逻辑
    console.log('我可以不吃饭')
};
function Person(name,age,like) {
    this.name=name;
    this.age=age;
    this.like=like;
    this.say=comSay;//不要加括号
};
var per1=new Person("司藤",300,'耍');
var per2=new Person('白浅','10000','耍');
console.log( per1.say==per2.say ) //true


这样我们就节约了空间。


每次调用的时候,都是同一个方法。


处理使用这种方法,我们还可以使用原型的方式


function Person(name,age,like) {
    this.name=name;
    this.age=age;
    this.like=like;
};
Person.prototype.comSay=function(){
    console.log('我可以不吃饭')
}
var per1=new Person("司藤",300,'耍');
var per2=new Person('白浅','10000','耍');
console.log( per1.comSay==per2.comSay ) //true
// 我们还可以通过原型来解决数据共享


原型的作用:数据共享,节约空间。

相关文章
|
监控 druid Java
监控druid数据库连接池连接泄露的思路
监控druid数据库连接池连接泄露的思路
1639 2
|
7月前
|
API PHP 索引
这插件太危险了!PDFParser自动扒取PDF每天躺赚300+的暴利搬运术
本文介绍了如何使用PHP提取PDF文档中的文字内容。为解决PDF文档“不可编辑”或“文本无法复制”的问题,推荐使用免费的PHP库——PDFParser。通过Composer安装后,可利用其简单强大的API解析PDF文件,提取文本内容。文章详细演示了获取PDF基本信息、全文内容、指定页内容及循环输出每页文本的方法,并附带中英文PDF示例,操作简便实用。
219 3
这插件太危险了!PDFParser自动扒取PDF每天躺赚300+的暴利搬运术
|
9月前
|
人工智能
SPO来袭:Prompt工程师90%不存在了?AI自动优化时代开启!
当你点进这个标题时内心是怎样复杂的心情,质疑,鄙夷,或者是惊讶?这也正是我们最初点开这篇论文时的心情。然而, 在完成项目测试后, 我们瘫坐在椅子上, 默默打下了 'Prompt工程师,不存在' 这几个
372 0
|
机器学习/深度学习 数据采集 算法
利用未标记数据的半监督学习在模型训练中的效果评估
本文将介绍三种适用于不同类型数据和任务的半监督学习方法。我们还将在一个实际数据集上评估这些方法的性能,并与仅使用标记数据的基准进行比较。
899 8
|
JavaScript 算法 Java
看不惯各种信息收集表,我手写了一个身份证号输入组件
`shigen`是一位专注于Java、Python、Vue和Shell等技术的博主,分享知识和成长经历。为应对需频繁输入身份证号码的情况,`shigen`决定研究身份证校验机制。研究过程中,了解到身份证号码的生成规则,包括18位数字及校验码计算。通过编写JavaScript代码,实现了两个级别的身份证号码验证:一级仅检查基本格式,二级则加入校验码计算,确保符合生成规则。代码示例展示了逐步增强的验证功能,防止随意修改身份证号码。欢迎交流讨论,共同进步!
230 3
看不惯各种信息收集表,我手写了一个身份证号输入组件
|
消息中间件 存储 缓存
消息中间件系列教程(06) -RabbitMQ -五种队列形式
消息中间件系列教程(06) -RabbitMQ -五种队列形式
1689 1
|
Java 数据库连接
Java中的静态代码块深入解析
Java中的静态代码块深入解析
291 0
|
SQL 监控 数据库
grafana 配置自定义dashboard
grafana 配置自定义dashboard
1325 0
grafana 配置自定义dashboard
|
NoSQL 网络协议 Redis
Redis的主从复制和哨兵模式
本文详细介绍了Redis的主从复制配置、原理(包括全量复制和增量复制)以及如何搭建一主二从的Redis集群,同时还探讨了Redis哨兵模式的概念、配置文件、以及如何配置一主二从三哨兵的Redis哨兵模式,以实现高可用性。