对不起Netflix和腾讯,我不喜欢你们的《三体》
06-21
原型 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的范围,你自然就会了解闭包。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-18
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用