JavaScript原型链学习有哪些知识要掌握
Admin 2022-06-18 群英技术资讯 302 次浏览
假设你声明一个方法叫做Foo()
,那么我们可以通过new Foo()
来声明实例。
function Foo() { console.log("我是一个构造方法"); } const f1 = new Foo();
现在你可以很清晰的明白Foo()
是构造函数,f1
是它的实例。
Foo()
这个构造函数是一个方法。
方法也是对象数据类型,所以可以说方法是个对象。
对象就有属性,不过方法有自己特殊的一个属性,叫做prototype
,其他对象没有哦。
这个属性会指向一个原型对象(Foo.prototype
),而原型对象也会有一个自己的属性叫做constructor
,指向属性包含了一个指针,指回原构造函数。
function Foo() { console.log("我是一个构造方法"); } const f1 = new Foo(); console.log(Foo.prototype);//Foo的原型对象 console.log(f1.prototype);//f1没有 underfied
上文的prototype
是给构造函数的所有实例提供共享方法和属性的。
实例又是怎么访问到共享方法和属性的呢?
f1实例没有prototype
,而有一个属性__proto__,
这是所有对象都有的属性,它指向到构造自己的构造函数的原型对象,然后js这个语言就是根据这个属性来让实例访问到共享属性和方法的
Foo是f1的构造函数,Foo.prototype
是Foo
的原型对象,所以f1.__proto__
指向Foo.prototype
function Foo() { console.log("我是一个构造方法"); } const f1 = new Foo(); console.log(Foo.prototype); console.log(f1.__proto__);
Foo这个构造函数如果希望自己的实例能够拥有同一个属性,比如name
,就在自己的原型对象上加上。
function Foo() { console.log("我是一个方法"); } Foo.prototype.name = "我是Foo创造的实例共享的属性"; const f1 = new Foo(); const f2 = new Foo(); console.log(f1.name);//我是Foo创造的实例共享的属性 console.log(f2.name);//我是Foo创造的实例共享的属性
上面说所有对象都有__proto__
,Foo是函数也是对象啊,所以Foo.__proto__
是啥呢?
那就去找Foo的构造函数是谁呢,Foo是一个函数,拥有函数特有的方法和属性,创造的它的构造函数就是Function,这个js自带的的一个构造函数,它的Function.prototype
给所有js中你创建的函数提供函数自带的一些公共方法和属性。
所以Foo.__proto__
指向Funtion.prototype
Foo.prototype
也是对象,所以它也有__proto__。
每当我们要找__proto__,
就得找它的构造函数,Foo.prototype
是个对象,纯对象,所以它的构造函数是Object,那么Object的原型就是Object.prototype。
Foo.prototype.__proto__
指向Object.prototype
Array
、String
、Funtion
、Object
这些构造函数都是函数,
都是Funtion构造函数的实例,
Array.__proto__
、String.__proto__
、Funtion.__proto__
、Object.__proto__
指向Funtion.prototype
原型,
可以调用Funtion.prototype
原型的一些公共方法,
例如都可以调用.name
查看自己的函数名字。
Array.prototype
、String.prototype
、Funtion.prototype
这些原型对象都是对象,
都是Object构造函数的实例,
Array.prototype.__proto__
、String.prototype.__proto__
、Funtion.prototype.__proto__
指向Object.prototype
原型,
所以可以调用Object.prototype
这个原型对象的公共方法,
而Object.prototype
有些特殊,它虽然是对象,但是并不是Object自己的实例,
Object.prototype.__proto__
指向null,作为原型链的终点
方法,也就是函数,才有prototype
,就是方法的原型。
所以实例,一般都会有个对应的构造方法,也就是构造函数,实例的__proto__
指向构造方法的原型。
js有很多自带的构造方法,例如Array
、String
、Funtion
、Object
,都是根据js一些对象类型分配的,他们的原型上提供了许多封装好的常用方法。
所有构造方法本身是函数,是Funtion
这个js自带构造函数的实例。
除了Object.prototype
,所有构造方法的原型本身是对象,是Object这个js自带构造函数的实例。
Object.prototype.__prototype
指向null,作为原型链终点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
并发控制是确保及时纠正由并发操作导致的错误的一种机制。我们在开发过程中,有时会遇到需要控制任务并发执行数量的需求。那么就需要做并发控制。例如一个爬虫程序,可以通过限制其并发任务数量来降低请求频率,从而避免由于请求过于频繁被封禁问题的发生。关于并发控制大家都了解了,下面我们就来说说JavaScript怎样实现并发控制?
本文主要介绍了在vue中写jsx的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要给大家介绍JS中的Proxy对象,一些朋友可能对Proxy对象的用途以及用法不是很了解,对此下文有详细的介绍,有需要的朋友可以参考下面的代码,接下来我们一起来学习Proxy对象吧。
jQuery跨域访问的解决方法及要点是什么?跨域访问一直都是程序员们头疼的问题,对于很多用户们来说都不知道如何解决,好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题..有必要记下来备忘.
这篇文章介绍了Node.js进程管理之进程集群,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008