JS-原型与继承-构造函数,普通对象,与prototype和__proto__理解

__proto__ 每一个变量都有这个属性,指向该对象的构造函数的原型对象。(指向这个对象的父级元素)

例如:

number类型

<script>
    let num = 123;
    console.log(num.__proto__);     //Number构造函数
    console.log(num.prototype);     //undefined
</script>

string类型

<script>
    let str = "123";
    console.log(str.__proto__);  //String构造函数
    console.log(str.prototype);  //undefined
</script>

综上,可以看到,每一种变量都有__proto__属性,这个是绝对的,指向的是该变量(也可以说对象)的构造函数原型对象。

---------------------------------------------

prototype,这个属性,构造函数才有。(指向这个构造函数的原型对象)

上面这句话,不太好理解,看下面的代码:

<script>
    
    function User(){}   //User是一个构造函数

    let hd = new User();    //hd是构造函数的实例化对象

    //hd作为一个构造函数的实例化对象,只有__proto__

    //而User是一个构造函数,既是函数,也是对象
    //作为一个函数,它有属性 prototype  User.prototype是hd.__proto__
    //作为一个对象,它有属性 __proto__  User.__proto是构造函数Function()的实例化对象
    console.log(hd.__proto__);
    console.log(User.prototype);
    console.log(hd.__proto__ == User.prototype);    //true

</script>

 

关于prototype与__proto__容易让人疑惑的点是,构造函数也有__proto__属性。

之所以会这样,是因为构造函数也是一个对象,它是构造函数Function()的实例对象。

因此,所有构造函数的__proto__属性都指向Function构造函数的原型对象。

---------------------------------------------------------------------------------------------------------------------
同时,原型对象是特殊的对象,每个构造函数的原型对象都会有一个__proto__属性,共同指向构造函数Object()的原型对象。构造函数Object()的原型对象,作为除自身以外被所有原型对象指向的对象,其担当着根节点的角色,它的__proto__属性指向null。

posted @ 2022-03-09 21:35  沉梦昂志_doc  阅读(53)  评论(0编辑  收藏  举报