js是基于原型的语言(prototype-based language),基于原型是面向对象的一种流派。所谓原型就是自身相关属性做为模板为新对象所使用,js有以原型为核心的树状层级结构。原型和原型链也是深刻学习js的过程当中必须了解的知识点。javascript
先祟随便写一个函数java
var f=function(){}
console.log(f);
复制代码
运行,发现它有一个prototype属性: 编程
不只这个函数,全部的函数包括构造器Array、Fuction......都会有这个 prototype属性,编程语言
prototype就是原型,每个函数都有prototype,prototype的值是一个对象。函数
仍是刚才的例子,咱们会发现这个函数的prototype里有一个constructor方法:学习
全部函数都有这个constructor方法,constructor方法指向这个函数自己。ui
仍是先整一段代码,随便搞一个对象spa
let a={
b:1,
c:2
}
console.log(a)
复制代码
运行,发现它有一个__proto__属性:prototype
值得一提的是,由于函数也是对象,因此函数既有prototype也有__proto__。code
当咱们在js中访问某一个对象某个属性时,会先在对象中寻找,若是找不到,就去原型对象上找,若是还找不到,就在原型对象的原型对象上找,以此类推,这样就构成了人体蜈蚣(?什么玩意)通常的原型链。原型链有点相似于继承的感受。
举个例子:
function F(){}
var f=new F;
console.info(f);
console.info(f.__proto__);
console.info(f.__proto__.__proto__);
console.info(f.__proto__.__proto__.__proto__);
复制代码
运行结果:
这个例子能呈现一层又一层的原型链,可见原型链的顶层是null,所谓万物皆虚是也(笑)。
由于js是基于原型的编程语言,因此不建议随意更改构造器的prototype属性,否则会影响到全部是由该构造器创造的元素。
这篇文是对原型和原型链的皮毛概述,是我学习过程当中的小小总结,但愿有所帮助。