JS原型链 和 new对象的时候发生了什么?

80 阅读1分钟

一、js原型链

       原型链类 :(原型对象 , 构造函数 ,实例)      

image.png

-   原型:每个函数都有 prototype 属性,该属性指向原型对象;使用原型对象的好处是所有对象实例共享它所包含的属性和方法。
-   原型链:主要解决了继承的问题;每个对象都拥有一个原型对象,通过__proto__ 指针指向其原型对象,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null。      

   原型的作用:
    1.数据共享 节约内存空间
    2.实现继承
    注意:函数也是一个对象,对象不一定是函数。对象有__proto__属性,函数有prototype属性    

二、new对象的时候发生了什么?

function Person(name, age) {
  this.name = name;
  this.age = age;
}
let p = new Person("Alice", 23);
   以下为new Person() 的过程  
     1、创建一个空对象
            let obj = {};
     2、将空对象的原型对象指向构造函数的原型属性。从而继承原型方法。
            obj.__proto__ = Person.prototype;
     3、this指向空对象。执行构造函数中的代码,以获得私有属性。
            let result = Person.call(obj);
     4、判断构造函数的返回值类型,如果是值类型,则返回新对象。如果是引用类型,就返回这个引用类型的对象。
    if (typeof(result) == "object"){ 
          return p = result;
    }else{ 
          return p = obj;
    }