JavaScript进阶:js的一些学习笔记-原型

文章目录

        • js面向对象
          • 1. 原型
          • 2. constructor属性
          • 3. 对象原型
          • 4. 原型继承
          • 5. 原型链

js面向对象

构造函数 属性和方法

function Person(name,age){this.name = name;this.age = age;this.play = ()=>{console.log('玩!');}
}
const a = new Person('1',12),b = new Person('2',13);
console.log(a.play == b.play);
// flase
1. 原型

作用在构造函数的属性

  • 构造函数通过原型分配的函数是所有对象所共享的
  • js规定,每一个构造函数都有一个prototype属性,指向另一个对象,称为原型对象
  • 这个对象可以挂载函数,对象实例化不会多次创建原型上的函数,节约内存
  • 把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法
  • 构造函数和原型对象中的this都指向实例化对象
function Person(name,age){this.name = name;this.age = age;
}
Person.prototype.play = ()=>{console.log('玩');
}
const a = new Person('1',12),b = new Person('2',13);
console.log(a.play == b.play);
// true

在Array上定义方法max用于求数组中的最大值

Array.prototype.max = function(){let arr = this;let res = arr[0];for(let e of arr){if(e > res)res = e;}return res;
}const arr1 = [1,2,3];
console.log(arr1.max());
// 3
2. constructor属性

每个原型对象里面都有constructor属性,该属性执行该原型对象的构造函数

使用场景:如果有多个对象的方法,我们给原型对象采取对象形式赋值,但是这样就会覆盖构造原型对象原来的内容,这样修改后的原型对象constructor就不再指向当前构造函数了,此时,我们可以在修改后的原型对象中,添加一个constructor指向原来的构造函数

function Person(){}
/*Person.prototype = {// constructor:Person,play:function(){console.log('玩!');}
}
console.log(Person.prototype);
// {play: ƒ}
*/
Person.prototype = {constructor:Person,play:function(){console.log('玩!');}
}console.log(Person.prototype);
// {constructor: ƒ, play: ƒ}
3. 对象原型

对象都会有一个属性**_proto_指向构造函数的prototype原型对象,之所以对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有_proto_**原型的存在。

function Person(){}
const a = new Person();
console.log(a.__proto__ == Person.prototype);
// true
function Person(){}
const a = new Person();
a.__proto__.play = function(){console.log('哈哈');
}
const b = new Person();
b.play();
// 哈哈
4. 原型继承
function Person(){this.eyes = 2this.head = 1
}function Woman(){}
function Man(){}
Woman.prototype = new Person()
Woman.prototype.constructor = Woman;
Woman.prototype.play = function(){console.log('玩!');
}
Man.prototype = new Person();
Man.prototype.constructor = Man;const a = new Woman(),b = new Man();
console.log(a,b);

运行结果:

在这里插入图片描述

5. 原型链
function Person(){}
console.log(Person.prototype.__proto__ == Object.prototype)
// trueconsole.log(Object.prototype.__proto__);
// nullconst a = new Person();
console.log(a.__proto__.__proto__ == Object.prototype)
// true
  • 当访问一个对象的属性(或方法)时,首先查找这个对象自身有没有该属性
  • 如果没有就查找它的原型(也就是**_proto_**指向的prototype原型对象)
  • 如果还没有就查找原型对象的原型(Object的原型对象)
  • 依次类推一直找到Object为止(null)
  • **_proto_**对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线
  • 可以使用 instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上

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

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

相关文章

蓝牙耳机链接电脑莫名奇妙关机问题(QQ浏览器)

蓝牙耳机连接电脑听歌的时候,如果听歌软件是暴风影音,或者其它播放器,蓝牙不会自动关机,但如果是QQ浏览器,蓝牙耳机经常莫名其妙的关机,时间间隔忽长忽短,没有规律,解决办法就是重启…

使用 opencv 识别答题卡,生成填涂答案

一般答题卡设计时都在试卷4个角预留4个一样大小的黑块 仅能识别选择题判断题之类的填涂答题的题目,不能识别填空题应用题等其它主观题 使用 opencv 识别试卷图片中所有黑块,再根据黑块大小获取四个角的位置,根据四个黑块位置校正图像 将图…

【排序算法】-- 深入理解桶排序算法

概述 在计算机科学中,排序算法是一种对数据进行有序排列的重要技术。桶排序(Bucket Sort)是一种常见的排序算法,它通过将数据分到有限数量的桶中,并对每个桶中的数据分别排序,最后按照顺序将所有桶中的数据…

算法---滑动窗口练习-3(水果成篮)

水果成篮 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址:水果成篮 2. 讲解算法原理 算法的主要思想是使用滑动窗口来维护一个包含最多两种水果的子数组。定义两个指针 left 和 right 分别表示窗口的左边界和右边界。还定义了一个数组 hash 来记录水…

RabbitMQ 模拟实现【六】:程序模拟实现

文章目录 模拟实现模拟消费者模拟生产者效果展示 启动结果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/71841546ad8043f1bd51e4408df791de.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f6e3e72ff9a4483c978ec48e24f075c2.p…

Helm Chart部署最简SpringBoot到K8S(AWS EKS版)

目标 这里假设,我们已经基本会使用k8s的kubectl命令进行部署了,也已经会自己打docker镜像推送到AWS ECR上面去了。而且,已经在云上准备好了AWS ECR镜像库和AWS EKS的k8s集群了。 这个前提上面,我们今天使用Helm Chart项目准备k8s…

WPF —— TabControl、StackPanel 控件详解

1 TabControl简介 表示包含多个项的控件,这些项共享屏幕上的同一空间。 TabControl有助于最大程度地减少屏幕空间使用量,同时允许应用程序公开大量数据。 TabControl包含共享同一屏幕空间的多个 TabItem 对象。一次只能看到 TabControl 中的一个 Ta…

无人机自动返航算法实现与优化

一、引言 随着无人机技术的快速发展,其在航拍、农业、救援等领域的应用越来越广泛。在这些应用中,无人机的自动返航功能显得尤为重要。一旦无人机失去控制或与遥控器失去连接,自动返航算法能够确保无人机安全返回起飞点,避免损失和…

(008)Unity StateMachineBehaviour的坑

文章目录 StateMachineBehaviour同名函数的调用问题StateMachineBehaviour 的 OnState*、OnStateMachine* 的区别 StateMachineBehaviour同名函数的调用问题 1.如果脚本中,两个同名的函数都存在,那么两个函数都会被调用;如果只有其中一个同名…

探索编程新纪元:Code GeeX、Copilot与通义灵码的智能辅助之旅

在人工智能技术日新月异的今天,编程领域的革新也正以前所未有的速度推进。新一代的编程辅助工具,如Code GeeX、Copilot和通义灵码,正在重塑开发者的工作流程,提升编程效率,并推动编程教育的普及。本文将深入探讨这三款…

Outlook API发送邮件的方法?如何设置接口?

如何使用Outlook API发送电子邮件?怎么调用API接口? 为了满足更高级别的需求,我们可能需要通过编程的方式来操作Outlook,这时候,Outlook API就显得尤为重要了。那么,如何使用Outlook API发送邮件呢&#x…

Python Web开发记录 Day9:Django part3 用户管理

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、数据库准备2、用户列表3、新建用户4、编辑用…