我们先聊聊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. 显示oracle表的分区信息

    显示分区表信息 显示数据库所有分区表的信息:DBA_PART_TABLES 显示当前用户可访问的所有分区表信息:ALL_PART_TABLES 显示当前用户所有分区表的信息:USER_PART_TAB ...

  2. HashTable初次体验

    用惯了数组.ArryList,初次接触到HashTable.Dictionary这种字典储存对于我来说简直就是高大上. 1.到底什么是HashTable HashTable就是哈希表,和数组一样,是一 ...

  3. 微信小程序与传统APP十大优劣对比

    随着微信公众平台的开放,微信端小程序涌现市场,带来很很多便利和简单的原生操作,询:微信端小程序是否会替代传统的APP应用?两者的优劣如何?我们一起来看看传统APP与微信端小程序十大优劣对比       ...

  4. Elasticsearch Configuration 中文版

    ##################### Elasticsearch Configuration Example ##################### # This file contains ...

  5. 如何在ARM中创建Express Route

    很早之前就想试试Azure的express route,但是一直没有找到合适的机会,正好有个客户需要上express route,所以最近先自己研究研究,防止在做poc的时候耗费更多时间,本次场景我们 ...

  6. Object类和常用方法

    Object类是java语言的根类,要么是一个类的直接父类,要么就是一个类的间接父类.所有对象(包括数组)都实现这个类的方法. 引用数据类型:类/接口/数组,引用数据类型又称之位对象类,所谓的数组变量 ...

  7. visual studio 2013 中配置OpenCV2.4.13 姿势

    首先在path中添加 “C:\OpenCV\opencv\build\x64\vc12\bin”   (地址随实际变化) 注:添加的都是*86不使用*64 在visualstudio 2013中配置 ...

  8. Nagios安装

    在做安装之前确认要对该机器拥有root权限. 确认你安装好的Fedora系统上已经安装如下软件包再继续: Apache GCC编译器 GD库与开发库 可以用yum命令来安装这些软件包: yum ins ...

  9. 前后端分离中,Gulp实现头尾等公共页面的复用

    前言 通常我们所做的一些页面,我们可以从设计图里面看出有一些地方是相同的.例如:头部,底部,侧边栏等等.如果前后端分离时,制作静态页面的同学,对于这些重复的部分只能够通过复制粘贴到新的页面来,如果页面 ...

  10. 关于SimpleAdapter和ListView结合使用,实现列表视图的笔记

    使用ListView需要为其添加适配器: 适配器有两种:1.ArrayAdapter  --用于单独文字显示 2.SimpleAdapter --用于文字和图片显示 这里主要记录SimpleAdapt ...