zoukankan      html  css  js  c++  java
  • js深入研究之扩展类,克隆对象,混合类(自定义的extend函数,clone函数,与augment函数)

    1.类扩展

    /* EditInPlaceField类 */
    /* 扩展函数 */ 
    function extend(subClass, superClass) {
      var F = function() {};
      F.prototype = superClass.prototype;
      subClass.prototype = new F();
      subClass.prototype.constructor = subClass;
    
      subClass.superclass = superClass.prototype;
      if(superClass.prototype.constructor == Object.prototype.constructor) {
        superClass.prototype.constructor = superClass;
      }
    }
    
    
    function EditInPlaceField(id, parent, value) { // 构造函数
      this.id = id;
      this.value = value || 'default value';
      this.parentElement = parent;
    
      this.createElements(this.id);
      this.attachEvents();
    };
    
    EditInPlaceField.prototype = {
      createElements: function(id) {
        this.containerElement = document.createElement('div');
        this.parentElement.appendChild(this.containerElement);
    
        this.staticElement = document.createElement('span');
        this.containerElement.appendChild(this.staticElement);
        this.staticElement.innerHTML = this.value;
        
        this.fieldElement = document.createElement('input');
        this.fieldElement.type = 'text';
        this.fieldElement.value = this.value;
        this.containerElement.appendChild(this.fieldElement);
        
        this.saveButton = document.createElement('input');
        this.saveButton.type = 'button';
        this.saveButton.value = 'Save';
        this.containerElement.appendChild(this.saveButton);    
    
        this.cancelButton = document.createElement('input');
        this.cancelButton.type = 'button';
        this.cancelButton.value = 'Cancel';
        this.containerElement.appendChild(this.cancelButton);    
            
        this.convertToText();
      },
      attachEvents: function() {
        var that = this;
        addEvent(this.staticElement, 'click', function() { that.convertToEditable(); });
        addEvent(this.saveButton, 'click', function() { that.save(); });
        addEvent(this.cancelButton, 'click', function() { that.cancel(); });
      },
      
      convertToEditable: function() {
        this.staticElement.style.display = 'none';
        this.fieldElement.style.display = 'inline';
        this.saveButton.style.display = 'inline';
        this.cancelButton.style.display = 'inline';        
    
        this.setValue(this.value);
      },
      save: function() {
        this.value = this.getValue();
        var that = this;
        var callback = {
          success: function() { that.convertToText(); },
          failure: function() { alert('Error saving value.'); }
        };
        ajaxRequest('GET', 'save.php?id=' + this.id + '&value=' + this.value, callback);
      },
      cancel: function() {
        this.convertToText();
      },
      convertToText: function() {
        this.fieldElement.style.display = 'none';
        this.saveButton.style.display = 'none';
        this.cancelButton.style.display = 'none';     
        this.staticElement.style.display = 'inline';
    
        this.setValue(this.value);
      },
      
      setValue: function(value) {
        this.fieldElement.value = value;
        this.staticElement.innerHTML = value;
      },
      getValue: function() {
        return this.fieldElement.value;
      }
    };
    
    var titleClassical = new EditInPlaceField('titleClassical', $('doc'), 'Title Here');
    var currentTitleText = titleClassical.getValue();
    
    /* EditInPlaceArea类 */
    
    function EditInPlaceArea(id, parent, value) {
      EditInPlaceArea.superclass.constructor.call(this, id, parent, value);
    };
    extend(EditInPlaceArea, EditInPlaceField);
    
    // Override certain methods.
    
    EditInPlaceArea.prototype.createElements = function(id) {
      this.containerElement = document.createElement('div');
      this.parentElement.appendChild(this.containerElement);
    
      this.staticElement = document.createElement('p');
      this.containerElement.appendChild(this.staticElement);
      this.staticElement.innerHTML = this.value;
      
      this.fieldElement = document.createElement('textarea');
      this.fieldElement.value = this.value;
      this.containerElement.appendChild(this.fieldElement);
      
      this.saveButton = document.createElement('input');
      this.saveButton.type = 'button';
      this.saveButton.value = 'Save';
      this.containerElement.appendChild(this.saveButton);
    
      this.cancelButton = document.createElement('input');
      this.cancelButton.type = 'button';
      this.cancelButton.value = 'Cancel';
      this.containerElement.appendChild(this.cancelButton);
          
      this.convertToText();
    };
    EditInPlaceArea.prototype.convertToEditable = function() {
      this.staticElement.style.display = 'none';
      this.fieldElement.style.display = 'block';
      this.saveButton.style.display = 'inline';
      this.cancelButton.style.display = 'inline';
    
      this.setValue(this.value);
    };
    EditInPlaceArea.prototype.convertToText = function() {
      this.fieldElement.style.display = 'none';
      this.saveButton.style.display = 'none';
      this.cancelButton.style.display = 'none';
      this.staticElement.style.display = 'block';
    
      this.setValue(this.value);
    };

    2.对象克隆

    /* EditInPlaceField对象*/
    /* 克隆函数 */
    function clone(object) {
        function F() {}
        F.prototype = object;
        return new F;
    }
    
    var EditInPlaceField = {
      configure: function(id, parent, value) {
        this.id = id;
        this.value = value || 'default value';
        this.parentElement = parent;
    
        this.createElements(this.id);
        this.attachEvents();
      },
      createElements: function(id) {
        this.containerElement = document.createElement('div');
        this.parentElement.appendChild(this.containerElement);
    
        this.staticElement = document.createElement('span');
        this.containerElement.appendChild(this.staticElement);
        this.staticElement.innerHTML = this.value;
        
        this.fieldElement = document.createElement('input');
        this.fieldElement.type = 'text';
        this.fieldElement.value = this.value;
        this.containerElement.appendChild(this.fieldElement);
        
        this.saveButton = document.createElement('input');
        this.saveButton.type = 'button';
        this.saveButton.value = 'Save';
        this.containerElement.appendChild(this.saveButton);    
    
        this.cancelButton = document.createElement('input');
        this.cancelButton.type = 'button';
        this.cancelButton.value = 'Cancel';
        this.containerElement.appendChild(this.cancelButton);    
            
        this.convertToText();
      },
      attachEvents: function() {
        var that = this;
        addEvent(this.staticElement, 'click', function() { that.convertToEditable(); });
        addEvent(this.saveButton, 'click', function() { that.save(); });
        addEvent(this.cancelButton, 'click', function() { that.cancel(); });
      },
      
      convertToEditable: function() {
        this.staticElement.style.display = 'none';
        this.fieldElement.style.display = 'inline';
        this.saveButton.style.display = 'inline';
        this.cancelButton.style.display = 'inline';        
    
        this.setValue(this.value);
      },
      save: function() {
        this.value = this.getValue();
        var that = this;
        var callback = {
          success: function() { that.convertToText(); },
          failure: function() { alert('Error saving value.'); }
        };
        ajaxRequest('GET', 'save.php?id=' + this.id + '&value=' + this.value, callback);
      },
      cancel: function() {
        this.convertToText();
      },
      convertToText: function() {
        this.fieldElement.style.display = 'none';
        this.saveButton.style.display = 'none';
        this.cancelButton.style.display = 'none';     
        this.staticElement.style.display = 'inline';
    
        this.setValue(this.value);
      },
      
      setValue: function(value) {
        this.fieldElement.value = value;
        this.staticElement.innerHTML = value;
      },
      getValue: function() {
        return this.fieldElement.value;
      }
    };
    
    var titlePrototypal = clone(EditInPlaceField);
    titlePrototypal.configure(' titlePrototypal ', $('doc'), 'Title Here');
    var currentTitleText = titlePrototypal.getValue();
    
    /* EditInPlaceArea对象*/
    
    var EditInPlaceArea = clone(EditInPlaceField);
    
    // Override certain methods.
    
    EditInPlaceArea.createElements = function(id) {
      this.containerElement = document.createElement('div');
      this.parentElement.appendChild(this.containerElement);
    
      this.staticElement = document.createElement('p');
      this.containerElement.appendChild(this.staticElement);
      this.staticElement.innerHTML = this.value;
      
      this.fieldElement = document.createElement('textarea');
      this.fieldElement.value = this.value;
      this.containerElement.appendChild(this.fieldElement);
      
      this.saveButton = document.createElement('input');
      this.saveButton.type = 'button';
      this.saveButton.value = 'Save';
      this.containerElement.appendChild(this.saveButton);
    
      this.cancelButton = document.createElement('input');
      this.cancelButton.type = 'button';
      this.cancelButton.value = 'Cancel';
      this.containerElement.appendChild(this.cancelButton);
          
      this.convertToText();
    };
    EditInPlaceArea.convertToEditable = function() {
      this.staticElement.style.display = 'none';
      this.fieldElement.style.display = 'block';
      this.saveButton.style.display = 'inline';
      this.cancelButton.style.display = 'inline';
    
      this.setValue(this.value);
    };
    EditInPlaceArea.convertToText = function() {
      this.fieldElement.style.display = 'none';
      this.saveButton.style.display = 'none';
      this.cancelButton.style.display = 'none';     
      this.staticElement.style.display = 'block';
    
      this.setValue(this.value);
    };

    3.混合类

    /* 混合类 */
    /* 混合函数 */
    function augment(receivingClass, givingClass) {
      for(methodName in givingClass.prototype) { 
        if(!receivingClass.prototype[methodName]) {
          receivingClass.prototype[methodName] = givingClass.prototype[methodName];
        }
      }
    }
    
    /* 改进的增加函数 */
    
    function augment(receivingClass, givingClass) {
      if(arguments[2]) { // Only give certain methods.
        for(var i = 2, len = arguments.length; i < len; i++) {
          receivingClass.prototype[arguments[i]] = givingClass.prototype[arguments[i]];
        }
      } 
      else { // Give all methods.
        for(methodName in givingClass.prototype) { 
          if(!receivingClass.prototype[methodName]) {
            receivingClass.prototype[methodName] = givingClass.prototype[methodName];
          }
        }
      }
    }
    
    var EditInPlaceMixin = function() {};
    EditInPlaceMixin.prototype = {
      createElements: function(id) {
        this.containerElement = document.createElement('div');
        this.parentElement.appendChild(this.containerElement);
    
        this.staticElement = document.createElement('span');
        this.containerElement.appendChild(this.staticElement);
        this.staticElement.innerHTML = this.value;
        
        this.fieldElement = document.createElement('input');
        this.fieldElement.type = 'text';
        this.fieldElement.value = this.value;
        this.containerElement.appendChild(this.fieldElement);
        
        this.saveButton = document.createElement('input');
        this.saveButton.type = 'button';
        this.saveButton.value = 'Save';
        this.containerElement.appendChild(this.saveButton);
    
        this.cancelButton = document.createElement('input');
        this.cancelButton.type = 'button';
        this.cancelButton.value = 'Cancel';
        this.containerElement.appendChild(this.cancelButton);
            
        this.convertToText();
      },
      attachEvents: function() {
        var that = this;
        addEvent(this.staticElement, 'click', function() { that.convertToEditable(); });
        addEvent(this.saveButton, 'click', function() { that.save(); });
        addEvent(this.cancelButton, 'click', function() { that.cancel(); });
      },
      
      convertToEditable: function() {
        this.staticElement.style.display = 'none';
        this.fieldElement.style.display = 'inline';
        this.saveButton.style.display = 'inline';
        this.cancelButton.style.display = 'inline';
    
        this.setValue(this.value);
      },
      save: function() {
        this.value = this.getValue();
        var that = this;
        var callback = {
          success: function() { that.convertToText(); },
          failure: function() { alert('Error saving value.'); }
        };
        ajaxRequest('GET', 'save.php?id=' + this.id + '&value=' + this.value, callback);
      },
      cancel: function() {
        this.convertToText();
      },
      convertToText: function() {
        this.fieldElement.style.display = 'none';
        this.saveButton.style.display = 'none';
        this.cancelButton.style.display = 'none';     
        this.staticElement.style.display = 'inline';
    
        this.setValue(this.value);
      },
      
      setValue: function(value) {
        this.fieldElement.value = value;
        this.staticElement.innerHTML = value;
      },
      getValue: function() {
        return this.fieldElement.value;
      }
    };
    
    /* EditInPlaceField class. */
    
    function EditInPlaceField(id, parent, value) {
      this.id = id;
      this.value = value || 'default value';
      this.parentElement = parent;
    
      this.createElements(this.id);
      this.attachEvents();
    };
    augment(EditInPlaceField, EditInPlaceMixin);
    
    /* EditInPlaceArea class. */
    
    function EditInPlaceArea(id, parent, value) {
      this.id = id;
      this.value = value || 'default value';
      this.parentElement = parent;
    
      this.createElements(this.id);
      this.attachEvents();
    };
    
    // Add certain methods so that augment won't include them.
    
    EditInPlaceArea.prototype.createElements = function(id) {
      this.containerElement = document.createElement('div');
      this.parentElement.appendChild(this.containerElement);
    
      this.staticElement = document.createElement('p');
      this.containerElement.appendChild(this.staticElement);
      this.staticElement.innerHTML = this.value;
      
      this.fieldElement = document.createElement('textarea');
      this.fieldElement.value = this.value;
      this.containerElement.appendChild(this.fieldElement);
      
      this.saveButton = document.createElement('input');
      this.saveButton.type = 'button';
      this.saveButton.value = 'Save';
      this.containerElement.appendChild(this.saveButton);
    
      this.cancelButton = document.createElement('input');
      this.cancelButton.type = 'button';
      this.cancelButton.value = 'Cancel';
      this.containerElement.appendChild(this.cancelButton);
          
      this.convertToText();
    };
    EditInPlaceArea.prototype.convertToEditable = function() {
      this.staticElement.style.display = 'none';
      this.fieldElement.style.display = 'block';
      this.saveButton.style.display = 'inline';
      this.cancelButton.style.display = 'inline';
    
      this.setValue(this.value);
    };
    EditInPlaceArea.prototype.convertToText = function() {
      this.fieldElement.style.display = 'none';
      this.saveButton.style.display = 'none';
      this.cancelButton.style.display = 'none';
      this.staticElement.style.display = 'block';
    
      this.setValue(this.value);
    };
    
    augment(EditInPlaceArea, EditInPlaceMixin);

    点评:

    js分为类和对象、函数。

    其中又包含多种形式,属性,数组属性,函数,私有函数,公有函数,静态函数。

    小的基础方法,可以有大的用途,比如extend方法,clone方法,还有augment方法。

  • 相关阅读:
    04Windows频繁打开和关闭端口可能引发的问题 | 07.杂项
    04WebFinger的利用 | 02.技术预研 | Social
    Hunch:自动问答和决策机
    03PubSubHubbub 和 twisted 的 Persistent connections 能力 | 07.杂项 | Python
    01获取 Twitter User Profile 的三条路径 | 07.杂项
    大中华之事件监测
    一个如此简单的杀手级应用
    07爬虫的多线程调度 | 01.数据抓取 | Python
    02Twisted 构建 Web Server 的 Socket 长链接问题 | 07.杂项 | Python
    关于Cutt.com关于Topic Engine
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/5059352.html
Copyright © 2011-2022 走看看