JS进阶之原型

以前有在本身的文章中谈到对象,而说到对象咱们就不可避免的要扯到原型,而且原型也是咱们必须得理解到位的一个点,那接下来咱们就来聊一聊js的原型吧。函数

JS中一切皆为对象,那么原型也是一种对象。因此它有对象的特性,无非也是一系列无序键值对的集合,接着咱们就来具体看看吧

function person(name,age)
{
    this.name=name;
    this.age=age;   
}
var a=typeof person.prototype//object
var b=typeof person.prototype.constructor//function
var c=person.prototype.constructor==person//true

咱们能够看到咱们建立了一个构造函数person,经过prototype找到了原型对象,咱们能够看到如下几点

  • 用typeof能够看到原型确实是一个对象
  • 这个对象有一个constructor属性,属性值是function
  • 这个function就等于构造函数person

此处咱们首先能够明确了构造函数和原型对象的关系了吧this

接着咱们再来看看原型和构造函数建立的对象的关系

function person(name,age)
{
    this.name=name;
    this.age=age;   
}
var pengl=new person("pengl",100);
var flag=person.prototype.constructor==pengl.constructor;//true

咱们依然能够看到新建对象的构造函数就是原型对象的构造函数。

本质:原型对象中的原型两字是对谁的原型,其实是对于新建的这些对象的原型,是这些对象中那些不变的,共有的东西,好比构造函数,各个对象的区别只是在于经过构造函数新建该对象时,传入的参数不一样。而像构造函数或者一些其余创建在原型上的方法和属性都是属于原型级别的,只是新建的对象做为它的具体实例能够用而已。prototype

咱们能够从这样一个角度来理解

function person(name,age)
{
    this.name=name;
    this.age=age;
    this.func=objFunc;
    function objFunc (argument) {
        alert("我是属于新建对象的方法")  
    }   
}
var pengl=new person("pengl",100);
pengl.func();

另外一段代码

function person(name,age)
{
    this.name=name;
    this.age=age;   
}
person.prototype.func=function (argument) {
      alert("我是属于新建对象原型上的方法") 
}
var pengl=new person("pengl",100);
pengl.func();

第一段和第二段的区别就是是否把func方法建立在构造函数中,第一段就是直接在新建对象的级别上建立了一个方法,第二段是在新建对象的原型上建立的方法。从内存的角度看,对于第一段每建立一个对象,就要同时再建立一个func方法,而第二段是,不管建立多少个对象,都只须要一个func方法,这个方法是全部对象所共有的。code

最后咱们就要引出原型链了

从原型链的链字咱们就能够猜到大概是什么意思,好比咱们使用一个方法,先从该对象上找,若是没有那么就从该对象的原型上找,若是该原型没有,就从该原型的原型上找,以此类推。若是最后都没找到,则返回undefined对象

上面例子中的原型链:

pengL->person.prototype->object.prototype->null内存


至此原型就到此为止啦,咱们最后进行一下总结吧

  • 原型是对象
  • 原型包含了新建对象的各类共有的方法和属性
  • 使用对象的方法或属性流程是:先从该对象找,没有则从它的原型上找,再没有,就从原型的原型上找,以此类推
PS:若是以上表述有问题,欢迎你们留言指正。
相关文章
相关标签/搜索