我们先聊聊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. cross_domain

    要传参数的页面 引用cross_domain.js  这个是另外一个工程(m)的地址 <script type="text/javascript" src="htt ...

  2. jQuery $(document).ready() 与window.onload的区别

    ps:jQuery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,虽然具有类似的效果,但是它们在触发操作的时间上存在着微妙的差异. 在j ...

  3. 使用xib封装一个view的步骤

    1.新建一个xib文件描述一个view的内部结构(假设叫做SSTgCell.xib) 2.新建一个自定义的类 (自定义类需要继承自系统自带的view, 继承自哪个类,  取决于xib根对象的Class ...

  4. jdbc 设置连接支持多条sql

    jdbc 参数加上 &allowMultiQueries=true 参考资料: 1.https://my.oschina.net/zhuguowei/blog/411853  Jdbc Url ...

  5. Java Netty 4.x 用户指南

    问题 今天,我们使用通用的应用程序或者类库来实现互相通讯,比如,我们经常使用一个 HTTP 客户端库来从 web 服务器上获取信息,或者通过 web 服务来执行一个远程的调用. 然而,有时候一个通用的 ...

  6. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  7. my97中文乱码问题

    在使用my97日期插件后页面显示中文乱码问题: 解决方法: 把下面这段代码复盖到你的ZH-CN.js就解决了 var $lang={ errAlertMsg: "\u4E0D\u5408\u ...

  8. jeecg bootstrap修改单列模版

    在作者原来的模版上增强单列模版 <%@ page language="java" import="java.util.*" contentType=&qu ...

  9. testng 失败自动截图

    testng执行case failed ,testng Listener会捕获执行失败,如果要实现失败自动截图,需要重写Listener的onTestFailure方法 那么首先新建一个Listene ...

  10. sublime一些快捷键

    语法: 后代:> 缩写:nav>ul>li <nav> <ul> <li></li> </ul> </nav> ...