原型和原型链

448 阅读2分钟

1、原型 prototype

普通函数用typeof进行类型判断时显示的是function

<script>
    var a = function () {
        console.log('这是一个普通的函数');
    }
    // 通过typeof显示类型
    console.log('a='+typeof a);
​
​
    //  a=function 
​
​
    </script>

构造函数用typeof进行类型判断时显示的是object

function a() {
​
 this.age = 11;
​
 console.log();
​
  }
​
  var b = new a();
​
  console.log(typeof b);  
​
  // b=object

同样是使用function创建,但构造函数和普通函数在使用的时候方式不同,导致结果也不同, 而这就是使用new关键字实例化的时候发生的变化:

我们创建的每一个函数,解析器都会向函数中添加一个属性prototype,而这个属性对应着一个对象,这个对象就是我们所谓的原型对象。 这个原型对象包含两部分(constructor 和 __ proto **).其中constructor指向函数本身,而 __** proto__则指向了构造器的原型。

原型的概念: 每一个javascript对象(除null外)创建的时候,就会与之关联另一个对象,这个对象就是原型,每一个对象都会从原型中“继承”属性。

image-20211031190301668.png

2、 __ _proto __ _

当函数以构造函数对的形式调用时,他所创建的对象中会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过 __ _proto __ _来访问该属性。

image-20211031204814309.png

3、constructor

原型对象内部也有一个指针(constructor)指向构造函数

image-20211031205146825.png

构造函数、实例和原型对象的区别与联系:

  1. 实例对象就是通过构造函数创建的。实例创造出来就具有 constructor 属性(指向构造函数)和 __ _proto __ _ 属性(指向原型对象)。
  2. 构造函数中有一个prototype属性。这个属性是一个指针,指向它的原型对象。
  3. 原型对象内部也有一个指针(constructor)指向构造函数。

总结:

原型对象就相当于一个公共的区域,所有同一类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。

当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用。如果没有则会去原型中寻找,如果找到则会直接使用。

以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样不用分别为每一个对象添加,也不会影响到全局作用域就可以使每个对象都具有这些属性和方法了。

\