web前端-javascript-prototype原型(说明,访问,优势,判断是否含有一个属性,原型对象的原型)

news2024/11/18 7:52:19

prototype 原型

1. 原型介绍

function Person() {}
function MyClass() {}

//向MyClass中添加属性a
MyClass.prototype.a = 123;

//向MyClass的原型中添加一个方法
MyClass.prototype.sayHello = function () {
  alert("hello");
};

var mc = new MyClass();
var mc2 = new MyClass();

console.log(MyClass.prototype);
console.log(mc2.__proto__ == MyClass.prototype);

//向mc中添加a属性
mc.a = "我是mc中的a";

console.log(mc2.a);
mc.sayHello();

请添加图片描述

请添加图片描述

1.1. 说明

  1. 我们所创建的每一个元素,解析器都会向函数中添加一个属性 prototype
  2. 这个属性对应着一个对象,这个对象就是我们所谓的原型对象
function MyClass() {}
var mc = new MyClass();
console.log(MyClass.prototype);

1.2. 访问

  1. 如果我们的函数作为普通函数调用 prototype 没有任何作用
  2. 当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性
    • 指向该构造函数的原型对象,我们可以通过下划线proto来访问该属性
function Person() {}
function MyClass() {}

var mc = new MyClass();
var mc2 = new MyClass();

console.log(MyClass.prototype);
console.log(mc2.__proto__ == MyClass.prototype);
  1. 原型对象就相当于一个公共的取区域,所有同一个类的实例都可以访问到这个原型对象
    • 我们可以将这对象中共有的内容,统一设置到原型对象中
  2. 当我们访问对象的一个属性或者方法时,它会先在对象的自身中寻找,如果有则直接使用
  3. 如果没有则会去原型对象中寻找,如果找到则直接使用
function Person() {}
function MyClass() {}

//向MyClass中添加属性a
MyClass.prototype.a = 123;

var mc = new MyClass();
var mc2 = new MyClass();

//向mc中添加a属性
mc.a = "我是mc中的a";

console.log(mc2.a);

1.3. 优势

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

2. 原型对象的原型

/*
 * 创建一个构造函数
 */
function MyClass() {}

//向MyClass的原型中添加一个name属性
MyClass.prototype.name = "我是原型中的名字";

var mc = new MyClass();
mc.age = 18;

console.log(mc.name);

//使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
console.log("name" in mc);

console.log(mc.hasOwnProperty("name"));

console.log(mc.hasOwnProperty("hasOwnProperty"));

console.log(mc.__proto__.hasOwnProperty("hasOwnProperty"));

console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));

console.log(mc.__proto__.__proto__.__proto__);

console.log(mc.Hello);

console.log(mc.__proto__.__proto__.__proto__);

请添加图片描述

2.1. 判断是否含有一个属性

  1. 使用 in 检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回 true
function MyClass() {}

//向MyClass的原型中添加一个name属性
MyClass.prototype.name = "我是原型中的名字";
var mc = new MyClass();

//使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
console.log("name" in mc);
  1. 可以使用对象的 hasOwnProperty()来检查对象自身中是否含有该属性
    • 使用该方法只有当对象自身中含有属性时,才会返回 true
function MyClass() {}

//向MyClass的原型中添加一个name属性
MyClass.prototype.name = "我是原型中的名字";
var mc = new MyClass();

console.log(mc.name);
console.log(mc.hasOwnProperty("name"));

2.2. 原型对象的原型

  1. 原型对象也是对象,所以它也有原型
  2. 当我们使用一个对象的属性或方法时,会先在自身中寻找
    • 自身中如果有,则直接使用,
    • 如果没有则去原型对象中寻找,如果原型对象中有,则使用
    • 如果没有则去原型的原型中寻找,知道找到 Object 对象的原型
  3. Object 对象的原型没有原型,如果在 Object 中依然没有找到,则返回 undefined
/*
 * 创建一个构造函数
 */
function MyClass() {}

//向MyClass的原型中添加一个name属性
MyClass.prototype.name = "我是原型中的名字";
var mc = new MyClass();

console.log(mc.hasOwnProperty("name"));
console.log(mc.hasOwnProperty("hasOwnProperty"));

console.log(mc.__proto__.hasOwnProperty("hasOwnProperty"));
console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));

console.log(mc.__proto__.__proto__.__proto__);
console.log(mc.__proto__.__proto__.__proto__);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用VUE自定义组件封装数据字典实战

背景 照惯例,先交待下背景,从真实需求出发,讲述设计思路和实现方式。 软件系统中,会有一些成组的常量值,来描述业务实体的属性,如性别、证件类型、审批状态等。我们通常称之为数据字典,作为系统…

Seata

Seata的三大角色 TC(Transaction Coordinator)-事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM(Transaction Manager)-事务管理器 定义全局事务的范围:开始全局事务、提交或回滚全局…

图片怎么编辑里面的文字?这篇文章告诉你方法

大家平时在分享自己拍摄的照片时,会不会觉得照片有点单调,留白面积大呢?其实这时候,我们可以给图片添加一些文字描述,就能够丰富图片的内容,并且我们也可以将这些加文字的图片当做表情包来使用。那么你们知…

【人工智能】【总结】CMSC5707 Advanced Topics in Artificial Intelligence

文章目录1. 音频信号处理介绍2. 音频信号预处理3. 特征4. 特征重现5. 语音识别6. AdaBoost7. 人脸识别8. 神经网络9. 卷积神经网络10. Auto-Encoder11. 循环神经网络 和 LSTM12. Word Representation13. 决策树1. 音频信号处理介绍 x KHz, y bit, n s 多少 byte: x∗1000∗y/8…

【12月9日更新1/4决赛预测】用二元泊松模型预测2022年世界杯淘汰赛结果

用二元泊松模型预测2022年世界杯淘汰赛结果 网上有很多文章用双泊松(Double Poisson)模型来预测世界杯比赛结果。但是双泊松模型有一个严重的缺陷,那就是它假设比赛中两队的比分是条件独立的。而我们都知道,在对抗性比赛中&…

【PCB设计】孔间距不可忽视,小心废板!

为什么有时候明明PCB设计没有检查出错误,但是在生产加工后还是出现短路、断板等不良情况? 那是因为你没有考虑到孔间距问题,导致在装配过程中无法避免的产生损耗。 PCB单面板或双面板的制作,都是在下料之后,直接进行非…

商品信息管理系统(Python)完整版

目录 功能模块: 实现思路: 运行功能演示: 具体实现过程: 定义商品类: 定义商品管理类 定义显示商品信息函数 输入销量函数: 添加商品信息: 删除商品信息 修改商品信息 导入商品信息…

Linux下安装Zookeeper教程

ZooKeeper 简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服…

字符串匹配算法(BFRK)

文章目录题目一、BF算法二、RK算法补充题目 有字符串 str1 和 str2 ,str1 中是否包含 str2,如果没有包含返回 -1,如果包含,则返回 str2 在 str1 中开始的位置 注:保证 str1 和 str2 字符串的长度大于 0 举例&#x…

k8s-kubeadm安装1.25.5

准备环境: 想体验下新的版本 主机名IP资源k8s-master192.168.1.1912u2G内存20G磁盘k8s-node192.168.1.1922u2G内存20G磁盘 1 修改主机名,配置hosts文件 # 修改主机名 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node # 修改h…

CMMI2.0配置管理工作及访谈学习笔记(续)

1. 配置管理岗位职责 范围:组织级和项目级配置管理管理对象为过程和产品,产品为识别出的配置项建立配置库:为项目建立开发库(管理库)、基线库,建立配置库结构并分配权限(命名规范)基…

猿如意中的【DBeaver】工具详情介绍

猿如意中的【DBeaver】工具详情介绍一、工具名称二、下载安装渠道2.1 什么是猿如意?2.2 如何下载猿如意?2.3 如何在猿如意中下载开发工具?三、工具介绍四、DBeaver功能介绍五、软件截图六、DBeaver安装过程6.1 在猿如意中下载DBeaver6.2 选择…

道路裂缝坑洼图像开源数据集汇总

CrackForest数据集 数据集下载链接:http://suo.nz/2wdNdX CrackForest数据集是一个带注释的道路裂缝图像数据库,可以大致反映城市路面状况。 道路裂缝坑洼图像数据集 数据集下载链接:http://suo.nz/3eEDlj 这个数据集是一个极具挑战性的集…

67、INGeo:利用占用网格先验加速/减少迭代次数

简介 论文地址:INGeo: Accelerating Instant Neural Scene Reconstruction with Noisy Geometry Priors 首先我们知道Instant-ngp利用最先进的射线推进技术(指数步进、空白跳过、样本压缩)实现密集网格自剪枝的采样策略,这种采样…

代码随想录训练营第48天|LeetCode 198.打家劫舍、213.打家劫舍II、 337.打家劫舍III

参考 代码随想录 题目一:LeetCode 198.打家劫舍 确定dp数组下标及其含义 dp[i]:考虑下标i(包括i)以内的房屋,可以偷窃的最大金额为dp[i]。确定递推公式 如果当前的第i个房间不偷,那么dp[i] dp[i-1].如…

干货收藏 |关键词优化攻略!(附11款关键词检索工具)

关键字搜索是买家查找产品的方式,一个高质量的关键词可以帮助卖家快速增加曝光率。简而言之,利用好关键词机理,能让我们的产品产生更有利的排名因素。 那如何找到合适的关键字,设置关键字时应该注意什么? 今天从产品的…

libcrypto-1_1.dll丢失,要怎么处理?

一般出现这个libcrypto-1_1.dll丢失的问题,我看绝大部分都是出在刺客信条这边的人,很多人吐槽 在运行刺客信条3游戏的时候遇到提示缺少libcef.dll文件的问题。其实遇到这问题还是比较好解决的。 libcrypto-1_1.dll丢失的处理方法 第一种,首…

云存储--1

背景 这一板块主要是讲诉云计算中的存储板块。 那么云存储主要分为三大类:块存储、文件存储、对象存储。 那么,这一章我们来了解一下什么是块存储,以及块存储在云计算当中的使用场景。 1、 什么是块存储? 我们来思考一个场景&a…

Spring Boot集成MyBatis

1.整合Durid数据源 1、引入Jar包 2.application.yml配置 3.读取配置类DruidConfig 总结:其实没有必要一个个手动去配置, druid 启动starter druid 自动配置类 2.整合MyBatis 2.1生成MyBatis代码: pom.xml generatorConfig.xml 运行插件—…

java计算机毕业设计ssm余庆金阳驾校管理系统75wh9(附源码、数据库)

java计算机毕业设计ssm余庆金阳驾校管理系统75wh9(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…