Js中的prototype、__proto__和constructor

Js中的prototype、__proto__和constructor

前言:阅读此文,请先阅读(Js面向对象的三大特点

  • 访问对象中不存在的属性,不会报错,而是返回undefined;
  • 强行给对象中不存在的属性或位置赋值也不会报错,而是自动在该位置添加新属性。

prototype

  • 当定义用于实例化对象的构造函数时,会附赠一个空的原型对象:构造函数 . prototype指向的就是原型对象
  • 原型对象中保存着所有子对象的共有属性和公共方法
  • 向原型对象中添加公共属性和方法
    i.找到当前构造函数的原型对象:构造函数 . prototype
    ii.向原型对象中添加公共属性和方法:强行赋值
    构造函数 . prototype . 方法名=function(){…}
  • 使用原型对象中的方法
    子对象 . 原型对象中的方法名

prototype vs __proto__

  • 为所有子对象保存共有方法的父对象,称为原型对象
  • 一个类型中,prototype和__proto___其实指向的是同一个原型对象
  • 区别:
    i. prototype属于构造函数对象,是站在和原型对象平级的位置,查找:构造函数 . prototype
    ii. __proto___属于每个子对象,是站在子级角度,称呼父对象
  • 所以:
    i. 想访问一个类型的原型对象都用:构造函数 . prototype
    ii.想访问某一个子对象的父对象都用:子对象 . __proto___

constructor

  • constructor是prototype上的一个保留属性,这个属性指向类的构造函数
尝试修改constructor:
function  Student(age){
  this.nowAge=age
}
Student.prototype.constructor=function(age){
  this.nowAge=age+1;
}
let  tom=new Student(2)
console.log(tom.nowAge); //输出2
所以,修改的只是prototype.constructor这个指针,真正的构造函数Student并不会被修改

prototype 和 __proto__和 constructor的关系

prototype 和 __proto__和 constructor的关系

猜你喜欢

转载自blog.csdn.net/Amazing_rabbit/article/details/108441855