zoukankan      html  css  js  c++  java
  • js误区——对象的重写与引用对象的解除

    本主在练习编写一个简单的js组件时,遇到一个小问题,苦思冥想不得其解,折腾来折腾去才明白原因只是一个误解,记录下来,提醒自己。(调试技术好烂啊!!!基础不牢坑死人!!!

    下面附上源码。是一个简单的小组件,在输入框输入文本后会显示输入了多少个字符。

     

    (function(window) {
      var Input = function(id) {
    
         this.DOMCollection=(function() {
    
          var obj = {};
          obj.input = $(id);
          obj.showBox = $('<span></span>');
          obj.input.after(obj.showBox);
    
          return obj;
        }());
    
        this.init(id);
    }; Input.prototype
    = (function() { function bindEvents() { var that = this; that.input.keyup(function() { render.call(that);//that引用的是obj对象。this以及this.DOMCollecton只是中间变量名。(这是误区的所在) }); } function render() { this.showBox.html(this.input.val().length); } return {
    init:
    function() { bindEvents.call(this.DOMCollection);//this.DOMCollection引用的是obj对象。 }, destory: function() {       // } } }()); var test = new Input('#test');  //当尝试修改DOMcollection来破坏组件的功能,没想到完全没作用。组件运行良好。 test.DOMCollection=null;
    var test2 = new Input('#test2');

     

    原因在于:将null赋值给test.DOMCollection只是解除了对obj对象的引用。所以并没有修改obj对象自身,并不会破坏组件。除非test.DOMColletion.input=null这种直接通过引用访问对象的属性值并更改值的方式。(前者解除对象的引用,后者更改对象的值)

    附:上面的方式把DOMCollection暴露给全局,还是可能被重写。可以把DOM对象的创建也放在prototype对象的某一私有方法内来隐藏。

  • 相关阅读:
    Django models 中导入重复数据的解决办法
    Python3 re
    Django 从请求到相应的过程
    Django session global配置
    CountDownLatch和CyclicBarrier用法及区别讲解
    npm
    go 实现爬虫
    go,redis实现订阅和发布
    使用Network Emulator Toolkit工具模拟网络丢包测试
    vue+element 使用多个el-select绑定的值为同一个值
  • 原文地址:https://www.cnblogs.com/byronvis/p/4621667.html
Copyright © 2011-2022 走看看