脑袋一团浆糊,但希望写点啥,所有就有了这篇博文了,抱歉哦。。。。开始吧!!!!

   什么是构造函数??

     所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用 new 运算符,就能生成实例,并且this变量会绑定在实例对象上。

     例如:写一个猫的原型对象

  function Dog(x,y){
  this.name = x;
  this.color = y
  }   <!-- 生成实例对象 -->
  var dog1 = new Dog("大毛","黄色");
  var dog2 = new Dog("二毛","黑色");   alert(dog1.name); // 大毛
  alert(dog1.color); // 黄色

    这时 dog1 和 dog2 会自动含有一个constructor属性,指向它们的构造函数。

   alert(dog1.constructor == Dog); //true
  alert(dog2.constructor == Dog); //true
  /*可以看出不论是dog1 还是dog2构造函数都为 Dog*/

    Javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系。

   alert(dog1 instanceof Dog); //true
  alert(dog2 instanceof Dog); //true

  

  

  构造函数的问题

  构造函数方法很好用,但是存在一个浪费内存的问题

   请看,我们现在为Dog对象添加一个不变的属性type(种类),再添加一个方法eat(吃)。那么,原型对象Dog就变成了下面这样:

    function Dog(name,color){
    this.name = name;
    this.color = color;
    this.type = "犬科动物";
    this.eat = function(){alert("啃骨头");};
  }

    生成实例:

   var dog1 = new Dog("大毛","黄色");
  var dog2 = new Dog("二毛","黑色");
  alert(dog1.type); // 犬科动物
  dog1.eat(); // 啃骨头

    表面上好像没什么问题,但是实际上这样做,有一个很大的弊端。那就是对于每一个实例对象,type属性和eat()方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率

    那么能不能让type属性和eat()方法在内存中只生成一次,然后所有实例都指向那个内存地址呢?回答是可以的。

  Prototype模式

  Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承

    这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上

   function Dog(name,color){
    this.name = name;
    this.color = color;
  }
  Dog.prototype.type = "犬科动物";
  Dog.prototype.eat = function(){alert("啃骨头")};

    生成实例:

  var dog1 = new Dog("大毛","黄色");
  var dog2 = new Dog("二毛","黑色");
  alert(dog1.type); // 犬科动物
  dog2.eat(); // 啃骨头

    这时所有实例的type属性和eat()方法,其实都是同一个内存地址,指向prototype对象,因此就提高了运行效率。

  

Js面向对象原型~构造函数的更多相关文章

  1. js面向对象(构造函数与继承)

    深入解读JavaScript面向对象编程实践 Mar 9, 2016 面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式,主要包括模块化.多态.和封装几种技术. 对JavaScript而言,其 ...

  2. js面向对象-原型链

    var Person = function (name) { this.name = name; } Person.prototype.say = function () { console.log( ...

  3. js面向对象之构造函数

    最简单的面向对象程序<script type="text/javascript"> var obj = new Object(); obj.qq = '10791611 ...

  4. JS面向对象——原型模型

    以下通过一段示例代码,说明原型模型中的基本概念以及知识点. <!DOCTYPE html> <html> <head> <title>原型模型</ ...

  5. js面向对象、创建对象的工厂模式、构造函数模式、原型链模式

    JS面向对象编程(转载) 什么是面向对象编程(OOP)?用对象的思想去写代码,就是面向对象编程. 面向对象编程的特点 抽象:抓住核心问题 封装:只能通过对象来访问方法 继承:从已有对象上继承出新的对象 ...

  6. JS面向对象(1)——构造函数模式和原型模式

    1.构造函数模式 构造函数用来创建特定的类型的对象.如下所示: function Person(name,age,job){ this.name=name; this.job=job; this.ag ...

  7. js面向对象(对象/类/工厂模式/构造函数/公有和原型)

    https://www.cnblogs.com/sandraryan/ 什么是对象 js中一切都是对象(有行为和特征).js允许自定义对象,也提供了内建对象(string date math等) 对象 ...

  8. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  9. 【JavaScript】 JS面向对象的模式与实践 (重点整治原型这个熊孩子 (/= _ =)/~┴┴ )

    参考书籍 <JavaScript高级语言程序设计>—— Nicholas C.Zakas <你不知道的JavaScript>  —— KYLE SIMPSON   在JS的面向 ...

随机推荐

  1. 从Excel到Python 数据分析进阶指南

    目 录   第1章 生成数据表 第2章 数据表检查 第3章 数据表清洗 第4章 数据预处理 第5章 数据提取 第6章 数据筛选 第7章 数据汇总 第8章 数据统计 第9章 数据输出 案例 990万次骑 ...

  2. 【python3两小时快速入门】入门笔记03:简单爬虫+多线程爬虫

    作用,之间将目标网页保存金本地 1.爬虫代码修改自网络,目前运行平稳,博主需要的是精准爬取,数据量并不大,暂未加多线程. 2.分割策略是通过查询条件进行分类,循环启动多条线程. 1.单线程简单爬虫(第 ...

  3. 【Spring源码解析】—— 策略模式在Spring中的应用

    一.         什么是策略模式 策略模式的定义/含义:策略本身就是为了实现某一个目标而采取的一种工作方式,因此只要能够达成目标,则采取哪一种策略都可以:因此多种实际的策略之间是相互平行的. 注意 ...

  4. C/C++应用程序内存泄漏检查统计方案

    一.前绪 C/C++程序给某些程序员的几大印象之一就是内存自己管理容易泄漏容易崩,笔者曾经在一个产品中使用C语言开发维护部分模块,只要产品有内存泄漏和崩溃的问题,就被甩锅“我的程序是C#开发的内存都是 ...

  5. 大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程

    目录 1.前述 2.向量空间的梯度下降: 3.函数空间的梯度下降: 4.梯度下降的流程: 5.在向量空间的梯度下降和在函数空间的梯度下降有什么区别呢? 6.我们看下GBDT的流程图解: 7.我们看一个 ...

  6. Js笛卡尔乘积

    self.getDescartesSku = function (selSaleProp, i, nowLst, allALst) {         if (selSaleProp.length = ...

  7. JavaScript 基础知识 变量与数据类型

    一.区分大小写 JS中一切(变量/函数名/操作符)都是严格区分大小写的 二.标识符 变量.函数.属性的名字以及函数的参数 命名规则:1.第一个字符可以是字母.下划线.美元符号$ 2.其他的字符可以是字 ...

  8. 驰骋工作流引擎ccflow-ccbpm工作流引擎sdk表单装载逻辑处理注意事项

    cbpm工作流引擎sdk表单装载逻辑处理注意事项 关键字:驰骋工作流引擎 sdk表单 装载接口调用   说明:如果您要采用ccbpm的sdk表单开发,在表单 加载前您需要调用一个接口来获得当前节点的信 ...

  9. bzoj3125: CITY 题解

    3125: CITY Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 486  Solved: 213[Submit][Status][Discuss] ...

  10. MyBatis 一对多映射

    From<MyBatis从入门到精通> <!-- 6.1.2.1 collection集合的嵌套结果映射 和association类似,集合的嵌套结果映射就是指通过一次SQL查询将所 ...