博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js深入研究之扩展类,克隆对象,混合类(自定义的extend函数,clone函数,与augment函数)...
阅读量:6328 次
发布时间:2019-06-22

本文共 13920 字,大约阅读时间需要 46 分钟。

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方法。

本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/5059352.html,如需转载请自行联系原作者
你可能感兴趣的文章
No!No!No! It's not fashion!
查看>>
深入理解JavaScript系列(40):设计模式之组合模式
查看>>
【转】Windows环境下Android NDK环境搭建
查看>>
WebStorm 2017.1增加对Vue.js的支持
查看>>
苏宁Nodejs性能优化实战
查看>>
Homebrew 1.9发布,将支持Linux与Windows 10
查看>>
ML.NET 0.2版增加了集群和新示例
查看>>
2015年度“最佳技术团队”和“最佳CTO”评选活动火热进行中
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
springboot的tomcat启动过程
查看>>
苏宁11.11:苏宁易购订单搜索系统架构及实现
查看>>
亚马逊是如何进行软件开发的
查看>>
More than React(二)组件对复用性有害?
查看>>
回应抗议,JetBrains放宽了许可条款
查看>>
京东618:揭秘大促销背后的个性化推荐
查看>>
阿里技术专家详解Dubbo实践,演进及未来规划
查看>>
铁线蕨算法(Adiantum)为低端智能手机提供磁盘加密服务
查看>>
JavaScript对象:我们真的需要模拟类吗?
查看>>
LFE将Lisp编程带到Erlang虚拟机上
查看>>
JetBrains发布了面向SQL DBA与开发者的工具DataGrip 1.0
查看>>