函数对象是JavaScript学习中不可避免的一部分,并且这一部分相对重要且抽象 函数的建立方式有2种:函数
var foo = function(){ console.log("test"); }
//let 函数名 = new Function(“参数列表”,”函数体”); let sum = new Function("num1,num2","return num1+num2");
咱们多数在使用new关键字的时候,是用于建立实例对象学习
那么咱们首先来看一下,在使用new关键字建立实例对象的时候,都经历了什么:this
这个时候咱们的关注点 原型对象 就出现了:prototype
prototype
prototype
是一个显式原型属性(也能够叫它原型对象),只有函数才有该属性,一般咱们叫这个时候的函数为"构造函数"prototype
的伴随构造函数的声明就会被自动建立prototype
只有一个属性:constructor
代码举例:code
function Student(name,age){ this.name = name; this.age = age; } let s1 = new Student("Tom",17);
首先咱们建立了一个构造函数Student
,此时Student
的结构中会出现一个prototype
属性,即原型对象,这是引擎自动给它的,咱们能够直接进行使用对象
prototype
中的constructor
属性:此时能够看出constructor
对应的是构造函数,也就是Student
blog
而且这是一个公有不可枚举属性,一旦改变了prototype
,这个属性就会不见,固然能够再手动添加回去继承
而当咱们再使用new关键字建立实例对象s1
以后,咱们来看一下s1
的结构:ip
实例对象s1
中除了在Student
得到的age
,name
属性以外,还有一个__proto__
属性,因此它又是什么东西呢?原型链
__proto__
是什么__proto__
是每一个对象都有的隐式原型属性,指向了建立该对象的构造函数的原型对象prototype
,可是 prototype
是内部私有属性,咱们并不能访问到,因此使用__proto__
进行访问
至于__proto__
是如何产生的,上面的new关键字建立函数的时候的第三部"连接到原型,继承属性和方法"的时候就让实例对象,例如s1
拥有了__proto__
属性
从实例对象s1
的__proto__
指向构造函数Student
的prototype
,构成了原型链
经过原型链的概念,咱们就不难理解实例对象是如何继承构造函数中原型对象的属性和方法了
function Student(name,age){ this.name = name; this.age = age; } Student.prototype.method = function(){ console.log("个人名字是"+this.name+",个人年龄是"+this.age); } let s1 = new Student("Tom",17); s1.method(); //个人名字是Tom,个人年龄是17
任意的一个函数, 都是至关于 Function 的实例. 相似于 {} 与 new Object() 的关系
function foo () {}; // 告诉解释器, 有一个对象叫 foo, 它是一个函数 // 至关于 new Function() 获得一个 函数对象
__proto__
属性Function.prototype
Fucntion.prototype
继承自 Object.protoype
array instanceof Array
判断 构造函数 Array 的原型 是否在 实例对象 array 的原型链存在