zoukankan      html  css  js  c++  java
  • Effective JavaScript Item 34 在prototype上保存方法

    本系列作为EffectiveJavaScript的读书笔记。

     

    不使用prototype进行JavaScript的编码是全然可行的,比如:


    function User(name, passwordHash) {
    	this.name = name;
    	this.passwordHash = passwordHash;
    	this.toString = function() {
    		return "[User " + this.name + "]";
    	};
    	this.checkPassword = function(password) {
    		return hash(password) === this.passwordHash;
    	};
    }
    
    var u1 = new User(/* ... */);
    var u2 = new User(/* ... */);
    var u3 = new User(/* ... */);
    

    当创建了多个User类型的实例时,就存在问题了:不仅是namepasswordHash属性在每一个实例上都存在,toStringcheckPassword方法在每一个实例上都有一份拷贝。就像下图表示的那样:




    可是,当toStringcheckPassword被定义在prototype上时,上图就变成以下这个样子了:




    toStringcheckPassword方法如今定义在了User.prototype对象上,也就意味着这两个方法仅仅存在一份拷贝,并被全部的User实例共享。

     

    或许你会觉得将方法作为拷贝放在每一个实例上。会节省方法查询的时间。(当方法定义在prototype上时。首先会在实例本身上寻找方法,假设没有找到才会去prototype上继续找)

     

    可是在现代的JavaScript运行引擎中,对方法的查询进行了大量优化,所以这个查询时间差点儿是不须要考虑的,那么将方法放在prototype对象上就节省了非常多内存。

     

    总结:

    1. 将方法存放在实例上会导致每一个实例都会拥有该方法的一份拷贝。导致内存的浪费。
    2. 优先将方法存放在prototype对象上。

  • 相关阅读:
    vue+element-ui实现前端分页
    element-UI中table表格的row-click事件怎么获取一行数据的id
    使用一个for循环将N*N的二维数组的所有值置1
    http常见的状态码
    反转一个英文句子中的单词,并且对应位置大小写不改变
    用一条SQL语句查出每门课都大于80分的学生的姓名
    平滑重启原理及平滑更新
    php之命名空间
    php之trait-实现多继承
    C入门之一
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6964100.html
Copyright © 2011-2022 走看看