zoukankan      html  css  js  c++  java
  • [Effective JavaScript 笔记]第34条:在原型中存储方法

    js中完全有可能不借助原型进行编程。不用在其原型中定义任何的方法。

    创建对象

    构造函数法

    所有属性和方法都在构造函数中定义

    function User(name,pwd){
      this.name=name;
      this.pwd=pwd;
      this.toString=function(){
          return '[User '+this.name+']';
      };
      this.checkPwd=function(pwd){
        return hash(pwd)===this.pwd;
      }
    }
    

    这样创建没有什么问题,但这里当我们构造多个User实例的时候,会占用过多的内存空间。

    var u1=new User(/* 一些参数 */);
    var u2=new User(/* 一些参数 */);
    var u3=new User(/* 一些参数 */);
    

    可以从下面的图里看出它们在内存中的情况。
    1465889655223

    原型和构造函数相结合

    function User(name,pwd){
      this.name=name;
      this.pwd=pwd;
      this.toString=function(){
          return '[User '+this.name+']';
      };
      this.checkPwd=function(pwd){
        return hash(pwd)===this.pwd;
      }
    }
    User.prototype.toString=function(){
        return '[User '+this.name+']';
    };
    User.prototype.checkPwd=function(pwd){
      return hash(pwd)===this.pwd;
    }
    

    当产生多个实例时

    var u1=new User(/* 一些参数 */);
    var u2=new User(/* 一些参数 */);
    var u3=new User(/* 一些参数 */);
    

    其内存结构图
    1465889688705

    对比

    可以看出,将方法存储在原型中,使其可以被所有的实例使用,而不需要给每个实例对象增加额外的属性。
    将方法存储在实例对象中会优化查找速度,当使用如u1.toString()方法,不需要搜索原型链来查找toString的实现。但,现代的js引擎深度优化了原型查找,所以将方法复制到实例对象并不一定保证速度有明显的提升。而且实例方法比起原型方法肯定会占用更多的内存。

    提示

    • 将方法存储在实例对象中将创建该函数的多个副本,因为每个实例对象都有一份副本

    • 将方法存储于原型中优于存储在实例对象中

  • 相关阅读:
    c++ 中的substr
    c++ 中将数字字符串转换成int输出的stoi() 和 atoi()
    c++ 四舍五入函数 round
    stddef.h----常用函数
    local.h-----地区函数
    errno.h-----定义出错代码
    signal.h-----信号函数
    stdio.h----标准的输入输出函数
    time.h-------日期与时间函数
    math.h--------数学函数
  • 原文地址:https://www.cnblogs.com/wengxuesong/p/5584984.html
Copyright © 2011-2022 走看看