js---原型,原型链

JavaScript|深入了解JS原型链 原型prototype 每个函数都有一个prototype属性,它默认指向一个object空对象(没有我们定义的属性),即称为原型对象。这里一般讨论构造函数。 其中Objecty也是有原型对象的。 当函数通过构造函数形式调用时,它所创建的对象都有一个隐含的属性:指向构造函数的原型对象,我们可以通过 __proto__ 来访问该属性。 原型对象中还有一个contructor属性,它指向函数对象。 构造函数、实例和原型对象在内存中的关系图1: 图1对应的伪代码如下: function Myclass(){ 阅读详情

1.原型---Person.prototype,在函数Person定义的时候就产生了,是所有由Person构造函数构造出的对象的祖先。祖先意味着子代可以继承他的属性。而这个Person.prototype等待着new时将自己放到this的__proto__中。

function Person(){
  //var this={__proto__:Person.prototype}
  ....//中间的代码
  // return this;
}
console.log(Person.prototype);//{constructor:Person(){},__proto__:Object}

2.原型链---就是在new Person()的时候,产生的this的同时,系统会给this配置一个属性__proto__,值是当前构造函数的原型即Person.prototype,通过原型的__proto__可以构成原型链。Person.prototype的__proto__指向的是Object,就构成了有两个原型的原型链,也就是person在Person.prototype找不到,可以到Object.prototype里找。

一切原型链的终端都是Object:

例如:

function Person(){
  //var this={__proto__:Person.prototype}
  // return this;
}
var person = new Person();
console.log(person.toString());//[object Object]  
//事实上在Person.prototype里没有这个toString方法,可以person依然可以调用,因为这个方法在Object.prototype上

3.原型系统默认会配属性:

constructor---指向当前原型是谁(哪个构造函数)的原型

__proto__----指向原型链中上一级的原型对象,可以被修改,修改后顺着__proto__找

例如:

function Person(){}
Person.prototype.name='ren';
function Student(){
  this.name='xuesheng'
}
var person = new Person();
Person.prototype = new Student();
console.log(person.name);//ren  为啥这里改了没用?因为你先new出来person,此时person的__proto__已经被Person.prototype赋值了。
//就是说__proto__里存的是Person.prototype的地址,你后来又给Person.prototype这个索引名字换了一个地址当然没作用
//你要是直接给person.__proto__换对象就会变,详情可以看原始型和引用型那章博客
var person1=new Person();
console.log(person1.name);//xuesheng 原型变成了student再new的
Person.prototype.name='lin';
console.log(person.name);//'ren' 修改新原型(student)的name,原先的原型不会改变
var person2 = new Person();
console.log(person2.name);//'lin' 此原型已经变了,再new就是遵循新的原型,而新的原型的name刚刚被改成了'lin'


4.不是所有对象都有原型的,比如由Object.create(null)出的对象,是没有原型的。

Object.create(原型)就是创建以什么为原型的对象。

例如:

var obj = {name:'Lin',age:12,sex:'female'};
var obj1 = Object.create(obj);
console.log(obj1,obj1.name);//{__proto__:{age:12,name:'Lin',sex:'female'}}  "Lin" 本身没有但是通过原型链找到父级有name属性
var obj2 = Object.create(null);
console.log(obj2);//{} 什么属性都没有的空对象
obj2.__proto__= obj //如果人为加__proto__是没有用的,系统默认产生的属性__proto__可以改,但是没有就是没有,人为加了也不会产生原型链的效果
console.log(obj2.name);//undefined
Object.create(原型,是否为可配置);
例子---啥叫可配置:凡是经过var声明出来的都是不可配置的,不能delete的
//在全局声明变量,相当于window.num = 123
var num = 123;
delete num;
console.log(num);//123 并没删掉--不可配置属性
var obj={name:'lin'}
delete obj.name;
console.log(obj.name);//undefined 删掉了--属于可配置的属性

5.赋值,正常来说子代只能获得父代的值,不能添加修改删除

但是,如果父代上时引用类型的值,可以通过子代改

function Father(){
    this.fortune={
        card1:'vasas'
    }
    this.name = 'heel';
    this.hel= 'haha'
}
function Son(){}
var father = new Father();
Son.prototype = father;
var son = new Son();
console.log(son.fortune.card1,son.name);//'vasas' 'heel'取到原型上的值
son.fortune.card1=2;
son.name=1;
console.log(father.fortune.card1,father.name,son.name);//2 'heel' 1 原型上原始值没有被修改,引用类型值被修改,自己身上添加了新属性
//想修改原型中的原始值,唯一方法就要在原型上操作
Son.prototype.hel='shen';
Son.prototype.name='haha';
console.log(father.hel,son.hel,father.name,son.name);//shen shen haha 1自己身上有就不会去原型身上找

6.原型链上常有名字相同的函数名,在执行的时候采取就近原则,找到就停止寻找,这是一种函数重写的方式。当然如果想要用某个原型上的方法,而不是默认的就近原则,可以用call/apply

var num=123,arr=[1,2,3],bol=true,str='12';
console.log(num.toString(),arr.toString(),bol.toString(),str.toString());//'123' '1,2,3' 'true' '12'
//还记得我们前面说的object.prototype上面的toString()出来的结果是类似于[Object XXX]的形式
//那么这几个为什么调用toString()之后都是字符串,证明Number.prototype,Array.prototype,Boolean.prototype,String.prototype上有toString函数的重写
//当然,如果你需要的时候也可以在原型链上采用重写的方式

//另外 document.write({})----[Object Object]说明是系统隐式调用了toString方法转换再输出
//所以undefined null 自己构造的没有原型的对象 都不能调用toSting() 也不能用document.write()方式打印 



js原型链污染 JavaScript 原型链是实现继承的一种方式,每个对象都有一个内部属性(在代码中可通过__proto__访问),它指向该对象的原型对象。当访问一个对象的属性或方法时,JavaScript 首先会在该对象本身查找,如果找不到,就会沿着原型链向上查找,直到找到该属性或方法,或者到达原型链的末尾(传统的面向对象(例如java),采用类的形式,以类为模版创建对象JavaScript 是基于原型链实现继承和封装。 阅读详情

相关推荐

西门子smart能搜到cpu但连接当前IP地址失败

将ip地址改到同一网段 本机为192.168.1.119就是192.168.1.1网段,但plc在192.168.0.1网段,所以显示ip连接失败,改为同一网段192.168.1.xxx即可(为避免ip冲突尽量改到200往后最大255)如果显示这一步,那么你的物理连接是没有问题的,应当是plc和电脑并不在同一网段导致的问题。输入ipconfig 查看本机网段与plc是否为同一网段。此电脑就不在同一网段所有造成通讯失败,接下来解决这个问题。win+r打开运行,打开cmd。再次尝试,如果还是报错,那么。

weixin_62678581的博客 9866

深入理解javascript原型链

  在javascript中原型和原型链是一个很神奇的东西,对于大多数人也是最难理解的一部分,掌握原型和原型链的本质是javascript进阶的重要一环。今天我分享一下我对javascript原型和原型链的理解。 一、对象等级划分   我们认为在javascript任何值或变量都是对象,但是我还需要将javascript中的对象分为一下几个等级。   首先Object是顶级公民,...

weixin_34245169的博客 480

实战指南:基于ELK与Grafana构建天融信防火墙日志可视化看板

本文详细介绍了如何基于ELK与Grafana构建天融信防火墙日志可视化看板,包括环境准备、日志收集与解析配置、Elasticsearch存储优化、Grafana看板设计等关键步骤。通过实战案例和优化技巧,帮助用户高效处理天融信防火墙日志,实现安全态势的可视化监控与分析。

weixin_34246529的博客 226

史上最全js原型/原型链,面向对象编程讲解

前言 本少观过诸多视频和文章,奈何使用频率少之又少,每次一到用处,发现忘的一干二净.然后又重头温习,记得笔记也丢三落四,找不到;所以存到网上,方便以后查询.这里吐槽一句,很多文章以偏概全,不得要领,实在让我头皮发麻.还是自己写一篇全文记载,美滋滋. 场景模拟 俗话说,好的解决方法,都是由于碰到了问题.没有问题的理论讲解,都是赤裸裸的耍流氓.讲解问题没有场景模拟,都是凑不要脸.那么看下,是哪些问题让...

李卓书 3073

一篇文章将三极管讲透:三极管从原理到应用,从参数到特性,从入门到精通

晶体三极管(Transistor)是一种半导体电子器件,也是电子工程中最基本的元件之一。它有三个区域,分别是P型半导体,N型半导体和P型半导体,从而形成PNP型晶体三极管或者NPN型晶体三极管。

学习帮的博客 9万+

Allegro17.4原理图-PCB双向联动技巧:从网表生成到同步高亮

本文深入解析了Cadence Allegro 17.4中原理图与PCB的深度双向联动技巧。核心在于通过精准的网表生成与管理、实时的跨窗口交互高亮与信号追踪,以及元件与封装的智能匹配更新,构建高效协同设计工作流。掌握这些技巧能显著提升高速、高密度电路设计的效率与准确性,实现从逻辑设计到物理实现的无缝衔接。

weixin_29178069的博客 358

【JS】深入理解JS原型和继承

说明:内容总结自王福朋的博客内容,原博客链接为:http://www.cnblogs.com/wangfupeng1988/tag/%E5%8E%9F%E5%9E%8B%E9%93%BE/ 前言  在学习JS中的原型,原型链,继承这些知识之前,我们先学习下基础知识:函数和对象的关系。  我们一直都知道,函数也是对象的一种,因为通过instanceof就可以判断出来。但是函数和对象...

胡小小六的博客 1万+

从FinFET到NanoSheet:一文看懂TSMC制程技术的架构革命与性能飞跃

本文深入解析了TSMC从FinFET到NanoSheet的制程技术架构革命。FinFET通过三维立体结构解决了短沟道效应,而NanoSheet采用环绕栅极设计,实现了更强的静电控制与设计灵活性,结合EUV光刻技术,共同推动了芯片性能与能效的飞跃,为下一代AI与高性能计算奠定基石。

i3j4k5的博客 288

JS面试点-JavaScript原型及原型链

为什么需要原型 在js中万物皆对象,对象可以说是重中之重了。每一个对象都拥有自己的属性。但是在这个世界中有很多东西都是相似的,可以归为一类,他们有共同的方法和属性。不可能让每一个对象都定义一个属性吧。那样太消耗内存了。所以,在js中怎么才能让多个对象共享一个或多个方法呢?原型的出现就是为了解决这个问题。 什么是原型对象 声明一个构造函数 function Person() { // 这是...

wfly blog 329

OCCT(Open CASCADE Technology)入门-2.搭建开发环境

安装完成后,在【扩展】菜单下会看到【Qt VS Tools】菜单,打开子菜单【options】进入qt配置窗口。打开VS后随便创建一个新项目,进入开发环境主页,打开顶部菜单【扩展】->【管理扩展】打开管理扩展窗口。然后点击右下角【创建】,一路【next】即可,最后会进入到开发主界面,得到一个下面的工程结构。好了,到这里基本的环境我们已经安装好了,下面我们开始创建项目并配置开发环境。打开顶部菜单【项目】,点击最后一个菜单项【xxx属性】,进入项目配置界面。这里的配置一般不用改,我们看【Versions】

2501_91235145的博客 2875

最佳量化交易的计算机操作系统

本文在Creative Commons许可证下发布   我经常被问到的一个问题是:用哪种计算机操作系统和计算软件进行量化交易的理论研究和代码实现?   我想把这个问题简化,从挑选的计算软件和计算库来反推最佳使用的计算机操作系统。简而言之,就是在本文撰写的时候而言,如果你想进行基于任何严肃的数学理论和金融量化交易研究理论,这里特指机器学习或者深度学习。并且需要在本地研究机器上使用桌面版本,...

evilqliang的博客 2307

js原型链详解

首先我们了解原型链要知道,重点在“链”。 先说一下原型链的主要角色 object构造函数,实例化对象(new xxx),原型对象。 把它们想成3个人,每个人手里有一把单向的锁链。 object构造函数的锁是.prototype 实例化对象的锁是内部指针 原型对象的锁是.constructor 然后这些实例化对象,构造函数,原型对象的关系就是恋爱。实例只能把铁链给原型对象(它深爱原型),...

Black____White的博客 401

华为OD新系统机试真题 - 配置操作失败数量统计

华为OD机试新系统 4月8号【配置操作失败数量统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【配置操作失败数量统计】。

qq_45776114的博客 1161

彻底弄懂javaScript中的原型、原型链(手绘js原型链图)

原型和原型链都是来源于对象而服务于对象的概念,所以我们要先明确一点:JavaScript中一切引用类型都是对象,对象就是属性的集合。、、、、等都是引用类型。也就是说 数组是对象、函数是对象、正则是对象、对象还是对象。 二、原型和原型链是什么 上面我们说到对象就是属性(property)的集合,有人可能要问不是还有方法吗?其实方法也是一种属性,因为它也是的表现形式,具体见下图。可以看到上确实多了一个的属性,值为一个函数,但是问题来了,上面并没有这个方法,为什么我们可以调用呢?这就引出了 原型。每一

懒散小青年的博客 1700

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【JavaScript】一文了解JS原型与原型链

浅解JavaScript中原型与原型链的概念及其应用

ztK63LrD的博客 1261

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Javascript原型链详解,一文带你彻底搞懂js原型、原型对象及原型链

原型链是 JavaScript 中的一个重要特性,它是实现对象之间继承关系的机制。在 JavaScript 中,每个对象都有一个原型属性,指向另一个对象。当试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到对应的属性或方法为止。

greatming666的博客 2110

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

「JavaScript深入」彻底搞懂JS原型与原型链

「JavaScript深入」彻底搞懂JS原型与原型链:原因、使用class实现继承、原型、原型链、prototype和proto

XH_jing的博客 1612

【JS】理解 JavaScript 的原型与原型链

在 JavaScript 中,每个函数都有一个prototype属性,这个属性指向一个对象,这个对象就是该函数的原型对象。原型对象可以包含属性和方法,这些属性和方法可以被该函数创建的所有实例对象所共享。// 输出:Hello, my name is Alice// 输出:Hello, my name is Bob在上面的例子中,Person函数的prototype属性指向一个原型对象,该原型对象包含一个sayHello方法。person1和person2都是Person。

2301_78802081的博客 1254

【JS】JavaScript 中的原型与原型链

JavaScript中的原型(prototype)和原型链(prototype chain)是面向对象编程中的重要概念,用于实现对象之间的继承和属性访问。

Eliaukoyx 1099

JS原型与原型链详解—JavaScript基础篇

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。字面意思即prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含属性和方法。无论什么时候,只要创建了一个新函数,就会根据一组特定规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。

qq_21280835的博客 1634

JavaScript原型和原型链

JavaScript 的核心机制原型和原型链是实现面向对象继承的关键。每个对象(除 null 外)都有一个原型对象作为模板,通过 __proto__ 属性访问,而函数对象特有的 prototype 属性指向其实例的原型。原型链由对象通过 __proto__ 连接形成,属性查找会沿链向上直至 Object.prototype(终点为 null)。通过将子类原型指向父类实例(而非直接共享父类原型)可实现继承,避免污染父类。原型链机制使 JavaScript 无需类也能实现继承,是理解面向对象编程的基础。

students33的博客 1454

JavaScript之彻底理解原型与原型链_js contructor

知识的海洋往往比想象中还要辽阔,原型与原型链这边也反复的学过多次,我认为应该学的比较全面,比较完善了。但遇到这个面试题后,我才发现我所学的只不过是一根枝干,JS里面真的有很多深层次的宝藏等待挖掘。学海无涯,与君共勉。本文部分图源:渡一教育的学习资料。

2401_87288988的博客 663

JavaScript什么是原型和原型链JS

从事前端这么久,发现原型和原型链一直都是云里雾里,网上看了好多文章、博客也还是不怎么明朗,相信被它困扰的小伙伴,不在少数 以下是我总结的原型和原型链,个人认为是比较浅显易懂的: 一、首先大家在对JS原型进行解释的时候,会涉及两个概念:构造函数、原型对象 构造函数:通俗的一句话说,就是你在script标签里面声明的函数: function Person(params) { /**我就是构造函数*/ } 原型对象:当我们创建了一个函数A,浏览器就会在内存中创建一个对象B

Liberty_yes的博客 732

JavaScript 原型/原型链

回到我们开篇的问题,class 关键字帮我们做了什么?instanceof 关键字又帮我们简化了什么?这两个问题的答案已经十分清晰了,但也不妨在这里做个总结:class 本质是一个语法糖,他帮我们处理绑定每个对象的原型,实现属性的共享。// 无 class 的写法// true// 对应的 class 写法显而易见的,class 的写法更符合我们面向对象的编程习惯,function 的写法则相对不那么直观。

专注前端领域方向的内容 1653

JS原型链

原型:被用于复制现有实例来生成新实例的函数 构造函数:用new来调用,就是为了创建一个自定义类实例:是类在实例化之后一个一个具体的对象原型链:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条

weixin_45045252的博客 1万+
上一篇: js---包装类
下一篇: js---call/apply,this
neoma安荷
博客等级 码龄9年 8粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值