JS对象的比较

由于JS是解释执行的语言,那么代码中出现函数与对象如果重复执行,会创建多个副本

  1. 创建一个Person构造函数,要求有name,age,gender,sayHello
  2. 代码如下:
     function Person(name,age,gender){
    this.name=name;
    this.age=age;
    this.gender=gender;
    this.sayHello=function(){};
    }

  3. 这种构造函数会影响性能,容易造成多个对象有多个对象副本,应该将方法单独抽取出来,让所有的对象共享该方法. 代码如下:
     function sayHello(){};
    function Person(name,age,gender){
    this.name=name;
    this.age=age;
    this.gender=gender;
    this.sayHello=sayHello;
    }

  4. 可以考虑将方法全部放到外面,但是有安全隐患
    • 在开发中会引入各种框架和库,自定义的成员越多,出现命名冲突的几率越大
    • 在开发中会有多个构造函数,,每一个构造函数有很多方法,就会变得不容易维护
  5. 解决办法是外面的函数不占用名字,而且在构造函数旗下就可以了
  6. 每一个构造函数在定义的时候,都会有一个神秘对象被创建出来
  7. 每一个由构造函数创建出来的实例对象都会默认的连接到该神秘对象上 代码如下:
    function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
Person.prototype.sayHello=function(){
console.log( 'hello!' ) ;
};
var p1=new Person('张三',10,'male');
p1.sayHello()
var p2=new Person('张四',13,'male');
p2.sayHello();

  1. 该神秘对象就是prototype,由构造函数创建出来的众多对象共享的一个对象
  2. 只需要将共享的东西,重复会多占用内存的东西放到构造函数.prototype中,那么所有的对象都可以共享

原型相关的概念

  1. 关于面向对象的概念

    • 类 class 在js中就是构造函数

      • 在传统的面向对象语言中,使用一个叫类的东西定义模版,然后使用模版创建对象
      • 在构造方法中也具有类似的功能,因此称其为类
    • 实例与对象
      • 实例一般是指某一个构造函数创建出来的对象,我们称这个对象为这个构造函数的实例
      • 实例就是一个对象,对象是一个泛称
    • 键值对与属性和方法
      • 在js中键值对的集合称为对象
      • 如果值为数据(非函数),就称该键值对为对象的属性 property
      • 如果值为函数,就称为对象的方法 method
    • 父类与子类
      • 传统的面向语言中使用类来继承,就有父类,子类的概念
      • 父类又称为基类, 子类又称为派生类
      • 在 js 中常常称为父对象, 子对象. 基对象, 派生对象
  2. 原型相关的概念

    • 神秘对象针对构造函数称为 "原型属性"

      • 神秘对象就是构造函数的原型属性
      • 简称原型
    • 神秘对象针对构造函数创建出来的对象称为"原型对象"
      • 当访问实例对象的属性时或方法时,如果构造函数没有,就到到对应的原型对象中去找
      • 简称原型
    • 对象继承自其原型
      • 构造函数创建的对象 继承自 构造函数的原型属性
      • 构造函数创建的对象 继承自 该对象的原型对象
      • 构造函数创建的对象与构造函数的原型属性表示的是两个不同的对象
        • 原型中的成员可以直接被实例对象所使用
        • 实例对象继承自原型
        • 这样的继承就是 "原型继承"
  3. 如何使用原型

    • 使用对象的动态特性

      • 构造函数.prototype.XXX = vvvv;
    • 直接替换
        Student.prototype = {
sayHello: function () {},
study: function () {}
};

最新文章

  1. java中volatile关键字的含义
  2. 代码中AggregateException的处理
  3. JAVA邮件发送的简单实现
  4. 新浪SAE部署django博客
  5. DTCMS中部分IE8不支持webupload上传附件的控件,更改为ajaxfileupload
  6. 【剑指offer】判断二叉树是否为平衡二叉树
  7. 146. LRU Cache
  8. 依赖注入及AOP简述(八)——混合请求模式 .
  9. SPRING 配置文件和类名
  10. sim卡中的汉字存储格式
  11. javascript的面向对象详解
  12. 深度学习系列 Part (2)
  13. Django源码分析之程序执行入口分析
  14. asp.net(C#)实现功能强大的时间日期处理类完整实例
  15. codeforces659C
  16. 揭秘Java热部署原理及JRebel(Hotcode)的实现原理
  17. docker私有仓库-https+nginx
  18. 【PostgresSQL】同时更新两个表
  19. BIO NIO AIO 简介
  20. 怎么在eclipse中查到这个类用的是哪个jar的类和Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案

热门文章

  1. Spark入门实战系列--9.Spark图计算GraphX介绍及实例
  2. 百度统计接口demo中错误
  3. Cordova webapp实战开发:(4)Android环境搭建
  4. Android SDK Android NDK Android Studio 官方下载地址
  5. MS SQL中使用UPDATE ... INNER JOIN ...
  6. Web API配置自定义路由
  7. sql 内连接和外链接
  8. Android录音应用
  9. 可注册两位字母+两位数字com域名大全(到2016-5-12:12时候)
  10. 第 25 章 CSS3 过渡效果