全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

js使用原型对象(prototype)需要注意的地方

我们先来一个简单的构造函数+原型对象的小程序

function CreateObj( uName, uAge ) {
      this.userName = uName;
      this.userAge = uAge;
    }
    CreateObj.prototype.showUserName = function () {
      return this.userName;
    }
    CreateObj.prototype.showUserAge = function () {
      return this.userAge;
    }

这个程序,没有什么问题,但是非常的冗余,每次扩展一个方法,都要写一次原型对象,我们可以把原型对象prototype当做一个字面量对象,所有的方法都在字面量对象中扩展,可以达到同样的效果:

CreateObj.prototype = {
      showUserAge : function(){
        return this.userAge;
      },
      showUserName : function(){
        return this.userName;
      },
    }
    var obj1 = new CreateObj( 'ghostwu', 22 );
    var obj2 = new CreateObj( '卫庄', 24 );
    console.log( obj1.showUserName(), obj1.showUserAge() ); //ghostwu 22
    console.log( obj2.showUserName(), obj2.showUserAge() ); //卫庄 24

但是这种原型(prototype)对象的写法,属于重写了CreateObj的默认原型对象,造成的第一个问题就是constructor不再指向CreateObj.

没有重写之前,constructor指向CreateObj

function CreateObj( uName, uAge ) {
      this.userName = uName;
      this.userAge = uAge;
    }
    CreateObj.prototype.showUserName = function () {
      return this.userName;
    }
    CreateObj.prototype.showUserAge = function () {
      return this.userAge;
    }
    console.log( CreateObj.prototype.constructor === CreateObj ); //true

重写之后,constructor指向Object

CreateObj.prototype = {
      showUserAge : function(){
        return this.userAge;
      },
      showUserName : function(){
        return this.userName;
      },
    }
    console.log( CreateObj.prototype.constructor === CreateObj ); //false
    console.log( CreateObj.prototype.constructor === Object ); //true

所以说,constructor不能准确的标识对象,因为他会被修改

我们之前写的程序,基本都是在原型对象(prototype)上扩展完了方法之后,再实例化对象,我们看下,先实例化对象,再在原型对象(prototype)上扩展函数,

实例对象是否能正常的调用到扩展的方法?

function CreateObj( uName, uAge ) {
      this.userName = uName;
      this.userAge = uAge;
    }
    var obj1 = new CreateObj( 'ghostwu', 22 );
    CreateObj.prototype.showUserName = function(){
      return this.userName;
    }
    console.log( obj1.showUserName() ); //ghostwu

可以正常调用,但是,如果原型对象是重写的,就调用不到了

function CreateObj( uName, uAge ) {
      this.userName = uName;
      this.userAge = uAge;
    }
    var obj1 = new CreateObj( 'ghostwu', 22 );
    CreateObj.prototype = {
      showUserName : function(){
        return this.userName;
      }
    }
    console.log( obj1.showUserName() ); //报错

因为重写了原型对象之后,同时实例化又是在重写之前发生的,所以实例的隐式原型__proto__不会指向重写的原型对象,所以就调用不到另一个问题,如果在原型对象(prototype)上有引用类型,千万小心,因为多个实例共用原型对象,只要有一个实例改变了引用类型的值,其他实例全部会收到改变之后的结果。

function CreateObj(){}
    CreateObj.prototype = {
      name : 'ghostwu',
      skills : [ 'php', 'javascript', 'linux' ]
    };
    var obj1 = new CreateObj();
    obj1.skills.push( 'python' );
    var obj2 = new CreateObj();
    console.log( obj2.skills ); //'php', 'javascript', 'linux', 'python'

原型对象(prototype)的共享特性,可以很方便的为一些内置的对象扩展一些方法,比如,数组去重复

Array.prototype.unique = function(){
      var res = [];
      for( var i = 0, len = this.length; i < len; i++ ){
        if( res.indexOf( this[i] ) == -1 ) {
          res.push( this[i] ); 
        }
      }
      return res;
    }
    var arr = [ 10, 20, 30, 20, 30, 20, 40, 20 ];
    console.log( arr.unique() ); //10, 20, 30, 40

但是,不要随便往内置的对象上面扩展方法,在多人协作开发,很容易产生覆盖,以及污染。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# js  # 原型对象  # prototype  # JS原型prototype和__proto__用法实例分析  # js构造函数constructor和原型prototype原理与用法实例分析  # javascript 对象 与 prototype 原型用法实例分析  # JavaScript使用prototype原型实现的封装继承多态示例  # [js高手之路]图解javascript的原型(prototype)对象  # 原型链实例  # JavaScript原型Prototype详情  # 重写  # 是在  # 都在  # 第一个  # 又是  # 多个  # 上有  # 很容易  # 我们可以  # 他会  # 写了  # 报错  # 可以达到  # 什么问题  # 很方便  # 先来  # 是否能  # 大家多多  # 要写  # 象中 


相关文章: 如何正确选择百度移动适配建站域名?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何在Windows 2008云服务器安全搭建网站?  如何快速搭建虚拟主机网站?新手必看指南  如何在IIS管理器中快速创建并配置网站?  建站之星收费标准详解:套餐费用及年费价格表一览  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站10G流量真的够用吗?如何应对访问高峰?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Python文件管理规范_工程实践说明【指导】  如何在香港服务器上快速搭建免备案网站?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  制作销售网站教学视频,销售网站有哪些?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何选择靠谱的建站公司加盟品牌?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  制作网站的公司有哪些,做一个公司网站要多少钱?  如何通过山东自助建站平台快速注册域名?  建站主机系统SEO优化与智能配置核心关键词操作指南    ,在苏州找工作,上哪个网站比较好?  如何批量查询域名的建站时间记录?  如何快速搭建个人网站并优化SEO?  建站之星安装模板失败:服务器环境不兼容?  焦点电影公司作品,电影焦点结局是什么?  如何快速查询网站的真实建站时间?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  网站制作需要会哪些技术,建立一个网站要花费多少?  西安大型网站制作公司,西安招聘网站最好的是哪个?  定制建站流程步骤详解:一站式方案设计与开发指南  如何在服务器上三步完成建站并提升流量?  教程网站设计制作软件,怎么创建自己的一个网站?  用v-html解决Vue.js渲染中html标签不被解析的问题  怀化网站制作公司,怀化新生儿上户网上办理流程?  PHP正则匹配日期和时间(时间戳转换)的实例代码  建站主机是否属于云主机类型?  招贴海报怎么做,什么是海报招贴?  微信推文制作网站有哪些,怎么做微信推文,急?  建站主机与虚拟主机有何区别?如何选择最优方案?  网站制作公司,橙子建站是合法的吗?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  建站之星图片链接生成指南:自助建站与智能设计教程  网站制作公司排行榜,抖音怎样做个人官方网站  如何通过VPS建站实现广告与增值服务盈利?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  如何用VPS主机快速搭建个人网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。