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。