JS中的原型和原型链

js是基于原型的语言(prototype-based language),基于原型是面向对象的一种流派。所谓原型就是自身相关属性做为模板为新对象所使用,js有以原型为核心的树状层级结构。原型和原型链也是深刻学习js的过程当中必须了解的知识点。javascript

prototype和__proto__

prototype

先祟随便写一个函数java

var f=function(){}
    console.log(f);
复制代码

运行,发现它有一个prototype属性: 编程

不只这个函数,全部的函数包括构造器Array、Fuction......都会有这个 prototype属性,编程语言

prototype就是原型,每个函数都有prototype,prototype的值是一个对象函数

constructor

仍是刚才的例子,咱们会发现这个函数的prototype里有一个constructor方法学习

全部函数都有这个constructor方法,constructor方法指向这个函数自己。ui

__proto__

仍是先整一段代码,随便搞一个对象spa

let a={
        b:1,
        c:2
    }
    console.log(a)
复制代码

运行,发现它有一个__proto__属性:prototype

__proto__是隐式原型,不只是这个对象, js中全部的对象都有__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属性,否则会影响到全部是由该构造器创造的元素。

结束

这篇文是对原型和原型链的皮毛概述,是我学习过程当中的小小总结,但愿有所帮助。

相关文章
相关标签/搜索