JavaScript进阶——原型、原型链、闭包

发布于:2024-10-24 编辑:匿名 来源:网络

原型 1.原型 在JavaScript中,每个函数都有一个prototype属性。当一个函数作为构造函数创建实例时,这个函数的prototype属性值会被赋给对象实例作为原型(即设置实例的__proto__属性),即所有实例的原型参考函数的原型属性。

**构造函数使用代码语言:javascript copy function Person(name,age){ this.name = name this.age =age}var p = new Person('张三',20);每个 JavaScript 对象(除了 null )都有一个名为 __proto__ 的属性。该属性将指向对象的原型代码语言: javascript copy console.log(p.__proto__ === Person.prototype); // true2.constructor 的每个原型都有一个 constructor 属性,指向关联的构造函数代码语言: javascript copy console.log(Person === p.__proto__.constructor); //true 在Javascript语言中,constructor属性是专门为函数设计的,它存在于每个函数的prototype属性中。

此构造函数保存对构造函数创建的对象的引用。构造函数指向构造函数,构造函数本身的构造函数指向Function本身,因为所有函数都是通过**new Function()**构造的 代码语言:javascript copy function Person() { } var p = new Person () console.log(Person.prototype); // 对象{} console.log(p.prototype); // 未定义 console.log(p.构造函数); //function Person(){} 这里的p是通过Person函数构造的,所以p的constructor属性指向Person console.log(Person.constructor); //前面提到过Function Function(){},每个函数其实都是通过new Function()来构造的 console.log({}.constructor); // function Object(){} 通过new Object()构造每个对象 console.log(Object.constructor ); // function Function() {} 对象也是一个函数,它是通过 Function() 构造的 console.log([].constructor); //function Array(){} 函数是由对象构造的对象,对象也是由函数构造的,既是函数又是对象,那么为什么构造函数是函数却返回对象呢?两者是相互继承的。

代码语言:javascript copy var o1 = new f1(); typeof o1 //"object" 原型 最重要的使用方法是将属性公开到公共代码中比较: 代码语言:javascript copy function Person(name,age){ this.name= 姓名; this.age = 年龄; this.sayHello = function(){ console.log(this.name + "打个招呼"); var Girl = new Person("贝拉",23); var boy = new Person("alex",23); console.log(女孩.名字); //贝拉 console.log(boy.name); //alex console.log(girl.sayHello === boy.sayHello); //false代码语言:javascript复制 function Person(name,age){ this.name = name; this.age = 年龄; } Person.prototype.sayHello=function(){ console.log(this.name + "打个招呼"); var Girl = new Person("贝拉",23); var boy = new Person("alex",23); console.log(女孩.名字); //贝拉 console.log(boy.name); //alex console.log(girl.sayHello === boy.sayHello); //true 总结:代码语言:javascript复制function Person(){ }var person1=new Person()person1.__proto__==Person.prototypeperson1.constructor==PersonPerson.__proto__==Function.prototypePerson.prototype.constructor==Personperson1.__proto__.constructor==Person原型链 在js中,大多数东西都是对象,数组是对象,函数也是对象,对象更是对象。无论我们为数组和函数定义什么内容,它们总是有一些相同的方法和属性。

例如valueOf()、toString()等。 ** 这说明一个对象拥有的属性不仅仅是它自己拥有的属性,还继承了其他对象的一些属性。

当js在一个对象中找不到需要的属性时,就会去该对象的父对象中查找,以此类推。这就构成了对象的原型链码语言: javascript copy function Foo(_name) { this. name = _name;}Foo.prototype.show = function() { console.log('我是', this.name);};var f1 = new Foo('obj1');var f2 = new Foo('obj2 ');f1.show(); // 我是 obj1f2.show(); // 我是obj2 //我们定义的show函数在Foo.prototype中。

当我们执行f1.show()时,js发现f1没有show这个属性,于是就去找f1的原型(即__proto__指向的对象)。如果找到它,它就可以调用所有函数。

所有函数都有一个原型指针,指向原型对象,比如图中Foo的原型。指针。

原型指针的意义是,当我们使用这个构造函数new创建一个新对象时,新对象的__proto__就指向原型。构造函数的原型所指向的原型对象有一个构造函数指针,它指向回构造函数。

如图所示,Foo.prototype的构造函数指针指向Foo。构造函数指针可以帮助我们找出对象的构造函数是谁。

每个对象都有 __proto__。 js创建新对象时,会将其__proto__指向构造函数原型所指向的对象。

上图中,实例对象f1和f2的__proto__都指向Foo.prototype。代码语言: javascript copy function Foo(_name) { this.name = _name;}Foo.prototype.show = function() { console.log('我是', this.name);};var f1 = new Foo( 'obj1');var f2 = new Foo('obj2');var obj = { type:1}f1.__proto__ = objconsole.dir(f1)f1.show(); // 我是 obj1f2.show(); // 我是obj2 Foo是一个函数,它的构造函数就是js里面的函数Function()。

Function的prototype指向一个对象Function.prototype,所以Foo的__proto__指向Function.prototype。所有函数 以 function Function() 作为构造函数,因此,所有函数**(包括 function Function() 和 function Object())** 的 __proto__ 都指向 Function.prototype 对象,该对象定义了所有函数共有的函数方法,比如call()、apply()等,让我们深入探讨一下。

Function.prototype 对象是一个普通对象。它的构造函数是js内置函数Object()。

函数Object()的原型指向Object.prototype,因此Function.prototype.__proto__就是Point to Object.prototype。这个对象定义了所有对象共有的属性,比如我们之前提到的 hasOwnProperty() 和 toString() 。

同样的,Foo.prototype等自定义对象也以__proto__指向Object.prototype对象。 Object.prototype 是原型链的末端。

它的 __proto__ 为空。 js查找属性时,如果这里还没有找到,即把闭包函数和函数内部可以访问的变量加在一起,形成一个闭包。

传统上认为一个函数嵌套另一个函数,两个函数之间的环境称为闭包,但实际上这也是一个制造过程。一个不会被污染的沙箱环境。

本质上,由于js函数作用域的存在,所有函数都可以是闭包代码语言: javascript copy function foo(){ var num = 1 function add(){ num++ return num } return add}var func = foo() func()闭包常用于间接访问变量,也可以理解为**隐藏变量。代码语言:javascript copy function foo(){ var num = 18 var obj = { text:'我是一个字符串', getNUm:function(){ return num } } return obj}var obj = foo()var Age = obj .getNUm()console.log(age) 由于JS函数内部可以使用函数外部的变量,而函数外部无法访问函数内部的变量,所以完全符合闭包的定义。

所以只要你了解了JS的范围,你自然就会了解闭包。

JavaScript进阶——原型、原型链、闭包

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 对不起Netflix和腾讯,我不喜欢你们的《三体》

    对不起Netflix和腾讯,我不喜欢你们的《三体》

    三体迷,只要你们愿意,全世界的屏幕都可以为你们闪现——Netflix版的《三体》第一季中文特辑是正式发布!据悉,Netflix 版本的《三体》由《权力的游戏》主创 David Benioff 和 D.B. 创作。 Weiss 和《极地恶灵》 第二季操作员 Alexander Woo。 原作者刘慈欣和英文翻译刘宇昆

    06-21

  • 蔚来李斌:芯片荒是短期压力,三季度会缓解

    蔚来李斌:芯片荒是短期压力,三季度会缓解

    预计二季度挑战会比较大。

    06-18

  • 云机器人运营商达闼完成超10亿元B+轮融资

    云机器人运营商达闼完成超10亿元B+轮融资

    据6月21日消息,近日,全球领先的云机器人运营商达闼科技完成超10亿元B+轮融资。 庚鑫资本由上海城投、上海国盛、君正资本、东方福海等机构投资,作为长期财务顾问。 达闼是世界上第一位云机器人运营商。 由黄晓庆先生(比尔黄)于2007年创立,为了实现家庭保姆机器人的企业愿

    06-18

  • 网龙将取消香港联交所创业板IPO,计划6月在香港主板上市

    网龙将取消香港联交所创业板IPO,计划6月在香港主板上市

    网络游戏开发商及运营商网龙网络有限公司(网龙集团,股票代码:)宣布,已于2020年5月23日收购港股 联交所上市委员会以介绍方式原则批准在香港联交所主板上市。 第一上海融资股份有限公司是该集团主板上市的保荐人。 网龙集团将于2020年6月12日召开临时股东大会,征求股东批

    06-17

  • 北汽蓝谷:北汽新能源与阿波罗智能签署战略合作框架协议

    北汽蓝谷:北汽新能源与阿波罗智能签署战略合作框架协议

    北汽蓝谷宣布,旗下北汽新能源与阿波罗智能签署战略合作框架协议,重点推进第五代大规模示范新一代Robotaxi共享自动驾驶汽车运营及商业试运营,探索下一代Robotaxi产品量产研发合作,在极虎品牌产品系列中推广Apollo汽车智能技术等,打造更好的全景智能驾驶产品和为用户带来

    06-18

  • 南大光电:ArF光刻胶已获得两家客户认证,计划产能可扩大至50吨

    南大光电:ArF光刻胶已获得两家客户认证,计划产能可扩大至50吨

    近日,南大光电在调查中表示,目前,公司研发的ArF光刻胶已获得两家客户认证,分别是一家存储芯片公司和一家逻辑芯片公司。 公司还重点针对国内最重要的客户进行认证,每个客户都有三到四种胶水正在接受认证。 光刻胶的认证一般需要一年以上的时间,并经过四轮以上的送样。 目

    06-06

  • 看亚洲之星:AyoBlajar在印尼课堂培育新教育文化

    看亚洲之星:AyoBlajar在印尼课堂培育新教育文化

    穆罕默德法里兹伊斯奈尼出身于普通家庭,从小就深知教育的重要性。 他对知识的渴望驱使他追求奖学金和尽可能最好的教育。 最终,他希望在教育系统中留下自己的印记。 AyoBlajar就是这样诞生的。 该初创公司现在是印度尼西亚双向学习的先驱,提供动态学习管理系统。 AyoBlajar

    06-17

  • “GE Fast Fitness”完成2000万元天使轮融资,专注互联网+智慧健身房

    “GE Fast Fitness”完成2000万元天使轮融资,专注互联网+智慧健身房

    据投资界6月5日消息,GE Fast Fitness已完成1万元天使轮融资理成资本。 下一步将扩大团队、品牌推广和门店数量。   GE专注于互联网+智慧健身房。 佩戴GE手环的会员可以在GE APP上管理健身、预订教练体验课程等。 教练APP可以安排课程、查看学生的班级状态等;此外,GE还有

    06-17

  • 疯狂!23 岁网红用 GPT-4「复制」自己,同时交往上千「男友」,想要每月狂赚 3500 万

    疯狂!23 岁网红用 GPT-4「复制」自己,同时交往上千「男友」,想要每月狂赚 3500 万

    疯狂的!一名23岁的网红利用GPT-4“复制”自己,同时约会数千名“男友”,想要月入3500万。 萨曼莎,电影《她》中的虚拟助理,有一个人类互动对象。 而爱上中间那一位,男主西奥多也只是百分之几。 这部电影于2017年上映,如今类似的情节已经逃出银幕,正在现实中发生。 23岁

    06-21

  • 据悉,贝恩资本将制定报价计划竞购东芝

    据悉,贝恩资本将制定报价计划竞购东芝

    据悉,贝因资将制定报价计划竞购东芝。

    06-18

  • 莱尔科技(688683.SH)昨天在上交所科创板挂牌

    莱尔科技(688683.SH)昨天在上交所科创板挂牌

    4月13日获悉,广东莱尔新材料科技股份有限公司(股票代码:83)举行挂牌仪式在上海证券交易所上市。

    06-17

  • 深入剖析《东京8分钟》AR特效背后团队:什么是科技与艺术的完美融合

    深入剖析《东京8分钟》AR特效背后团队:什么是科技与艺术的完美融合

    转眼奥运会结束了,中国队的优异成绩26金18银26铜成功夺得里约奥运会冠军。 拉上了窗帘。 相信在本届奥运会上,将会有大量用户通过智能电视观看奥运会。 像电视猫这样的视频聚合应用可以提供丰富的整合资源,让用户通过奥运专区全面观看奥运。 内容。 今天我们就简单讨论分析

    06-18