我们先聊聊Js的历史,1994年Netscape公司发布了Navigator浏览器0.9班。这是历史上第一个比较成熟的网络浏览器。轰动一时。但是,这个版本的浏览器只能用来浏览,不具备交互功能,最主要的就是表单验证了,无法做到表单验证,只能由服务器来判断 这样做就太浪费资源了

所以他们需要一种运行在浏览器的脚本语言去和网页互动。工程师Brendan Eich负责开发这种新语言,他觉得没必要设计的很复杂,只要能够完成一些简单操作就够了,比如判断表单验证

1994年正是面向对象编程 C++ Java , BrendanEich无疑受到了影响,Javascript里面所有的数据类型都是对象(object),那到底要不要设计“继承”机制呢?

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

但是他不打算引入“类class“的概念,一旦有了类,Js就是一种完整的面向对象编程语言了,这样好像有点太正式了,而且增加了入门的难度。他考虑C++和Java语言都是使用new命令生成实例。因此他就把new命令引入了Js,用来从原型对象生成一个实例对象,但是Js没有class类,怎么来表示原型对象呢?[Es6]是否脱离当时的初衷呢!!!!

这是他想到了C++和Java new的时候会调用类的构造函数,所以他做了一个简化的设计,在Js语言中,new命令后面跟的不是类,是构造函数。

new运算符有缺点,用构造函数生成实例有一个缺点就是无法共享属性方法,每次生成都是一个副本,这样极大的浪费了资源,考虑到这一点,Brendan Eich决定为构造函数设置一个prototype属性。这个属性包含一个对象(以下简称"prototype对象"),所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面。实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。

以DOG构造函数为例

function DOG(name){

    this.name = name;

  }

  DOG.prototype = { species : '犬科' };

  var dogA = new DOG('大毛');

  var dogB = new DOG('二毛');

  alert(dogA.species); // 犬科

  alert(dogB.species); // 犬科

species是实例共享的对象,是引用,只要修改了prototype对象的属性,就会影响到两个实例对象

 DOG.prototype.species = '猫科';

  alert(dogA.species); // 猫科

  alert(dogB.species); // 猫科

总结:由于所有的实例对象共享同一个prototype对象,那么prototype对象就好像是实例对象的原型,而实例对象则好像"继承"了prototype对象一样。这就是Js继承机制的思想!!

Javascript 构造函数原型继承机制的更多相关文章

  1. JavaScript大杂烩4 - 理解JavaScript对象的继承机制

    JavaScript是单根的完全面向对象的语言 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承.而在JavaScript的 ...

  2. javascript 之 prototype继承机制

    理解Javascript语言的继承机制 javascript没有"子类"和"父类"的概念,也没有"类"(class)和"实例&qu ...

  3. Javascript prototype 及 继承机制的设计思想

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

  4. JavaScript的原型继承

    JavaScript是一门面向对象的语言.在JavaScript中有一句很经典的话,万物皆对象.既然是面向对象的,那就有面向对象的三大特征:封装.继承.多态.这里讲的是JavaScript的继承,其他 ...

  5. JavaScript构造函数+原型创建对象,原型链+借用构造函数模式继承父类练习

    虽然经常说是做前端开发的,但常常使用的技术反而是JQuery比较多一点.在JavaScript的使用上相对而言少些.尤其是在创建对象使用原型链继承上面,在项目开发中很少用到.所以今天做个demo练习一 ...

  6. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  7. JS中的原型继承机制

    转载 http://blog.csdn.net/niuyongjie/article/details/4810835 在学习JS的面向对象过程中,一直对constructor与prototype感到很 ...

  8. Javascript的原型继承,说清楚

    一直以来对Javascript的原型.原型链.继承等东西都只是会用和了解,但没有深入去理解这门语言关于继承这方面的本质和特点.闲暇之余做的理解和总结,欢迎各位朋友一起讨论. 本文本主要从两段代码的区别 ...

  9. 谈谈javascript中原型继承

    什么是继承?拿来主义:自己没有,别人有,把别人的拿过来使用或者让其成为自己的 如何实现继承的方式 原型继承 混入继承 经典继承 1. 混入继承 由于一个对象可以继承自任意的对象,即:o可以继承自对象o ...

随机推荐

  1. POI对Excel自定义日期格式的读取

    用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel private List<String[]> rosolveFile(InputStream is, String ...

  2. CSS常用技术总结!~~

    //放大屏幕,背景图不变 background: url(x.png) no-repeat 0 0; background-image: -webkit-image-set(url(logo_db.p ...

  3. mongodb指南

    一.简介 从官网 https://www.mongodb.com/download-center?jmp=nav#community 下载相应平台及版本的 mongodb,解压后的 bin 文件夹中有 ...

  4. JDK,JRE,JVM,三者的区别于联系?

    万事开头难,从基础抓起! 下载JDK官网:http://www.oracle.com/technetwork/java/javase/downloads/index.html JDK:Java Dev ...

  5. SQL Server数据库SP命令祥解

    1.数据库: (1)sp_helpdb:报告有关指定数据库或所有数据库的信息.例:sp_helpdb   --显示所有数据库信息(名称.大小等)例:sp_helpdb Recruitment   -- ...

  6. 【荐】如何规划 Nginx 网站目录的权限(用户,用户组,ssh,sftp)

    从上一篇文章:PHP网站(nginx.php-fpm.mysql) 用户权限解析,可以学习了解到,nginx 和 php-fpm 的用户是如何运作的. 有个工作场景: 1.公司的一台 CentOS 服 ...

  7. web报表工具Stimulsoft Reports.Web在mvc项目中使用

    Stimulsoft Reports.Web,是一款可以直接在Web中编辑报表的报表工具 web项目技术框架mvc4+easyui+knockoutjs 1.在项目中添加引用 Stimulsoft.B ...

  8. 无中间变量交换swap(a,b)

    #include <stdio.h> /* 加减法 整型.浮点型(损失精度) */ void swap1(int *a,int *b) { *a=*a+*b; *b=*a-*b; *a=* ...

  9. linux git实现代理

    说明  Git 目前支持的三种协议 git://.ssh:// 和 http://,使用git:// 和 http://比较多,ssh://忽略,FQ后可以直接加快同步google和github代码. ...

  10. mysql 性能优化方向

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...