我们先聊聊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. Fedora20-32bit cross-compiling arm-linux-gcc4.3.2

    目录 0 前言 1 安装arm-linux-gcc-4.3.2 2 配置 nfs 服务器 0 前言 之前在 fedora 64bit 上建立交叉编译,但由于4.4.3版本需要另装用于gdb-serve ...

  2. 吐槽贴:百度地图 api 封装 的实用功能 [源码下载]

    ZMap 类 功能介绍 ZMap 是学习百度地图 api 接口,开发基本功能后整的一个脚本类,本类方法功能大多使用 prototype 原型 实现: 包含的功能有:轨迹回放,圈画区域可编辑,判断几个坐 ...

  3. Intellij Idea/Webstorm/Phpstorm 的高效快捷键

    1. shift + F6可以理解为F2的豪华重量版,不但可以重命名文件名,而且可以命名函数名,函数名可以搜索引用的文件,还可以重命名局部变量.还可以重命名标签名.在sublime text中有个类似 ...

  4. Eclispe远程调试tomcat设置

    首先在catelina.sh中添加 JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=23787,server=y,su ...

  5. JQuery动画队列问题

    在上网的时候经常会发现一些网站上发现一些bug,如导航菜单的动画队列问题(在同一个元素上执行多个动画,那么对于这个动画来说,后面的动画 会被放到动画队列中,等前面的动画执行完成了才会执行) 要解决问题 ...

  6. 3d转换-正方体-Html5Css3-遁地龙卷风

    (-1) 写在前面 我用的是chrome49,这个案例是从网上看到的,向这位同行致敬,建议大家在记录自己学习感悟时,向我一样加上笔名,被转载的时候还能留下点东西. 在研究slice-box.js的时候 ...

  7. BZOJ2292——【POJ Challenge 】永远挑战

    1.题意:dijkstra模板题,存点模板 #include <queue> #include <cstdio> #include <cstdlib> #inclu ...

  8. 解决VS2015安装后stdio.h ucrtd.lib等文件无法识别问题

    今天突然想在windows上装个 VS2015 玩玩,结果遇到了如下bug:安装完 VS2015 后,直接新建项目->win32控制台->运行,结果报错!"无法打开包括文件: & ...

  9. Anti XSS 防跨站脚本攻击库

    https://wpl.codeplex.com/ Before understanding Anti-Cross Site Scripting Library (AntiXSS), let us u ...

  10. Oracle 文件的导入与导出

    说明:本机使用的是32位oracle,使用的方法是plsql导入与导出 1.导出数据步骤. 1)登陆上plsql后在工具里选择导出用户对象,选择上所有的表在选择保存的路径.点击导出就可以了. 2)上边 ...