JS扩展类,克隆对象与混合类实例分析
网络编程 2021-07-04 19:19www.168986.cn编程入门
这篇文章主要介绍了JS扩展类,克隆对象与混合类,通过自定义extend,clone与augment函数实例分析了类的扩展,对象的克隆与混合类相关实现与使用技巧,需要的朋友可以参考下
本文实例讲述了JS扩展类,克隆对象与混合类。分享给大家供大家参考,具体如下
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 = { suess: 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 = { suess: 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 = { suess: 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方法。
更多关于JavaScript相关内容可查看本站专题《》、《》、《》、《》、《》、《》、《》、《》、《》及《》
希望本文所述对大家JavaScript程序设计有所帮助。
上一篇:jQuery插件扩展实例【添加回调函数】
下一篇:JS自定义混合Mixin函数示例
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指