原型和原型链

1.普通对象与函数对象

在JavaScript中,万物皆对象。对象分为普通对象和函数对象,那么怎么区分普通对象和函数对象呢?函数

function是js中自带的函数对象。经过new function()建立的对象都是函数对象。其余的都是普通对象。this

<script>
  var a1 = function(){};
  var a2 = new Function('小明');
  function a3(){};

  var b1 = {};
  var b2 = new Object();
  var b3 = new a3();
  console.log(typeof a1);//function
  console.log(typeof a2);//function
  console.log(typeof a3);//function
  console.log(typeof b1);//object
  console.log(typeof b2);//object
  console.log(typeof b3);//object

</script>

从上面代码中能够看出a1,a2,a3为函数对象,b1,b2,b3为普通对象。spa

2.原型对象

  在JavaScript中每当定义一个函数对象,对象都会包含一些预约义的属性,每一个函数都有一个prototype属性(原型属性),这个属性是一个指针,指向一个对象(原型对象),注:普通对象没有prototype,但有__proto__属性。prototype

如今建立一个函数看看,原型是什么?指针

<script>
  var test=function(){};
  console.log(test.prototype);//object{}
</script>

咱们能够看到原型就是一个空的对象,既然是一个对象,咱们就能够为他添加属性和方法。code

<script>

  var test=function(){};
  test.prototype.getName=function(){
    return this.name;
  }

</script>

原型对象是用来作什么的呢?主要做用是用于继承。举了例子:对象

var cart= function(name){
   this.name = name
  };
 cart.prototype.getName = function(){
     return this.name; 
  }
  var myCart= new cart(‘兰博基尼’);
  myCart.getName(); //兰博基尼

咱们能够看到,原型对象上添加的属性和方法,在函数建立的实例中依然可使用,这说明什么?blog

原型对象中的属性和方法是全部实例共享的。继承

3.原型链

JS在建立对象(不管是普通对象仍是函数对象)的时候,都有一个叫作__proto__的内置属性,用于指向建立它的函数对象的原型对象prototype。以上面的例子为例:ip

<script>
  var test=function(){};
  test.prototype.name="小明";
  test.prototype.sex="男";
  test.prototype.getName=function(){
    console.log(this.name);
  }
  var a1=new test();
  console.log(test.prototype);
  console.log(a1);
</script>

   咱们能够看到,test的原型对象和一个实例对象都有一个__proto__对象,可是指向不一样,原型对象中的__proto__指向Object,而实例中的__proto__指向内部明叫test的对象,展开这个对象能够看到就是原型对象。就是说每个实例中有一个__proto__属性指向原型对象。每个实例的内部都包含一个内部属性__proto__,指向了构造函数的原型,就是这个属性链接了实例和原型对象之间的关系,而且咱们知道实例中不包含name属性和getName方法,可是咱们却使用了getName(),就是经过这个__proto__属性查找的。

JS在建立对象(不管是普通对象仍是函数对象)的时候,都有一个叫作__proto__的内置属性,用于指向建立它的函数对象的原型对象prototype。

 console.log(zjh.__proto__ === person.prototype) //true

一样,person.prototype对象也有__proto__属性,它指向建立它的函数对象(Object)的prototype

  console.log(person.prototype.__proto__ === Object.prototype) //true

继续,Object.prototype对象也有__proto__属性,但它比较特殊,为null

  console.log(Object.prototype.__proto__) //null

咱们把这个有__proto__串起来的直到Object.prototype.__proto__为null的链叫作原型链

4.isPrototypeOf查找原型

使用方法a.isprototypeOf(b),判断对象a是不是实例b__proto__指向的原型对象,若是是返回true,不然返回false。看个例子

 var test = function test(){}
  test.prototype.name = "小明";
  test.prototype.age = "25";
  test.prototype.getName = function(){console.log(this.name);}
  var o1 = new test();

  console.log(test.prototype.isPrototypeOf(o1));//true

5、总结

1.原型和原型链是JS实现继承的一种模型。2.原型链的造成是真正是靠__proto__ 而非prototype。

相关文章
相关标签/搜索