Javscript继承机制

  一直以来,对与继承机制的理解都不是很透彻。最近看到一些介绍,对js的继承机制又有了更深入的认识。

      通过法国程序员Vjeux的解释,了解到。网景公司最初发布了Navigator浏览器0.9版本后,因为不具备与访问者互动的能力(如,网页上需要填写用户信息,但是浏览器本身无法判断用户是否填写了信息,只能将信息返回到服务器,服务器判断后返回信息,如此很浪费时间和服务器资源)所以网景公司需要一种脚本语言来使浏览器与网页互动。而当时的工程师觉得没有必要设计一种很复杂的语言,这种语言只要能完成简单的操作就够了。

  如果真的是一种简易的脚本语言,其实不需要有"继承"机制。但是,Javascript里面都是对象,必须有一种机制,将所有对象联系起来。所以,Brendan Eich最后还是设计了"继承"。

  但是,他不打算引入"类"(class)的概念,因为一旦有了"类",Javascript就是一种完整的面向对象编程语言了,这好像有点太正式了,而且增加了初学者的入门难度。

  因此,他就把new命令引入了Javascript,用来从原型对象生成一个实例对象。但是,Javascript没有"类",怎么来表示原型对象呢?

这时,他想到C++和Java使用new命令时,都会调用"类"的构造函数(constructor)。他就做了一个简化的设计,在Javascript语言中,new命令后面跟的不是类,而是构造函数。

  

function DOG(name){

    this.name = name;

}

  然后使用new关键字

var dogA = new DOG('小黄');

  就可以成功实例出对象。

  考虑到共享属性的问题,因此设计者又引入了prototype属性也叫原型对象,主要是为了实现继承,所有实例对象需要共享的属性和方法,都放在这个对象里面,那些不需要共享的属性和方法,就放在构造函数里面。实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。

function DOG(name){

    this.name = name;   //不需要共享的属性
    this.age= '3';//不需要共享的属性   
}
DOG.prototype = { kind: '哺乳动物' };//可以共享的属性,一改全改

  总结:

    对于js继承机制的理解,可以从横向和纵向两个角度来理解

    • 横向:构造函数内的属性和方法,可以被每个实例化的对象拥有,并且,各自独立修改互不影响。写在prototype原型对象中的属性和方法,为所有实例对象共有,一改全改。
    • 纵向:原型链的形成真正是靠_proto_而非prototype,一个对象的_proto_记录着自己的原型链,_proto_引用父类的prototype,函数的prototype不属于自身的原型链,它是创建子类的核心,原型对象上定义方法和属性是为了被子类继承和使用。 

 

posted @ 2019-03-18 17:17  三色草  阅读(126)  评论(0编辑  收藏  举报