美文网首页
JS中的原型和原型链(prototype、__proto__ 、

JS中的原型和原型链(prototype、__proto__ 、

作者: ChasenGao | 来源:发表于2019-05-09 00:02 被阅读0次

记录日期:2019/05/08 21:09
首先看一张图片

image.png
图片转自:https://blog.csdn.net/cc18868876837/article/details/81211729
有点懵,没关系。

1、原型 prototype
JS中所有函数都有prototype这个属性,反过来说,拥有prototype属性的对象的本身一定是函数。

2、 原型链
原型链是针对构造函数的,比如我先创建了一个函数,然后通过一个变量new了这个函数,那么这个被new出来的函数就会继承创建出来的那个函数的属性,然后如果我访问new出来的这个函数的某个属性,但是我并没有在这个new出来的函数中定义这个变量,那么它就会往上(向创建出它的函数中)查找,这个查找的过程就叫做原型链。

代码来说明:

function fn1() {
       this.a = 1
   }

   console.log(new fn1().a)  // 1 因为查到了a的值

   function fn2() {
       this.b = 2
   }

   fn2.prototype = new fn1() // 继承

   console.log(new fn2().a) // 1 fn2没有a的值,于是就向上查找,查到继承了fn1的a,则输出1,这个过程查找的过程,叫原型链。

ok,可能你会问,如果fn2中也定义了a怎么办?
看一下代码

    function fn1() {
        this.a = 1
    }

    console.log(new fn1().a)  // 1 因为查到了a的值

    function fn2() {
        this.a = 3;
        this.b = 2
    }

    fn2.prototype = new fn1() // 继承

    console.log(new fn2().a) // 3 因为fn2中找到了a的值,所以就不会往上查找了,则输出3

ok,可能你又会问,我就要输出刚才继承过来的a 怎么办?
那就强行让他往上查找一层,代码如下:

function fn1() {
        this.a = 1
    }

    console.log(new fn1().a)  // 1 因为查到了a的值

    function fn2() {
        this.a = 3;
        this.b = 2
    }

    fn2.prototype = new fn1() // 继承

    console.log(new fn2().a) // 3 因为fn2中找到了a的值,所以就不会往上查找了,则输出3
    console.log(new fn2().__proto__.a) // 1 向上查找了一层

ok,这里又有一个知识点,_ proto _ (因为无法显示双下横线,故添加了一个空格)

_ proto _可以理解为一个指针,它指向的是构造它的对象的对象的prototype,听起来有的拗口。举个例子吧!

    function fn1() {
        this.a = 1
    }

    console.log(fn1._ _proto_ _ == Function.prototype) // true

为啥? 因为function 等同于new Function, 所以fn1是由 Function构造的,因此fn1._ proto _ == Function.prototype

还不明白?再来个例子

    function fn1() {
        this.a = 1
    }

    var s = new fn1()

    console.log(s._ _proto_ _ == fn1.prototype) // true

为啥? 还用问吗,因为s是由fn1构造的,所以s._ proto _ == fn1.prototype

3、constructor
可以理解为:constructor指向当前 对象(函数)的构造函数

怎么理解?来个例子:

    var fn1 = function () {
        this.a = 1
    }
    var s = new fn1()
    console.log(s.constructor == fn1) //  true  s的构造函数是fn1
    console.log(fn1.constructor == Function) // true fn1的构造函数是Function

大概就是这么些,基本是我个人的理解,有的地方用词不太准确,望指正。

相关文章

网友评论

      本文标题:JS中的原型和原型链(prototype、__proto__ 、

      本文链接:https://www.haomeiwen.com/subject/wrqboqtx.html