`
wzf7065
  • 浏览: 247469 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

JS封装类或对象的最佳方案(转载)

 
阅读更多
原文地址:http://jiajun.iteye.com/blog/379748
JS封装类或对象的最佳方案



    面向对象强大的优点之一是能够创建自己专用的类或者对象,封装一组属性和行为。抛开性能来说,JS要比面向对象语言如JAVA要灵活好用的多,组装数据结构很灵活方便。那么我们如何来用面向对象的思维来定义JavaScript的类或对象呢?



问题的出现

如果要抽象出来一个人,那么简单的属性为:name,sex,birthday等,方法为:sayHi,最初级的写法就是

Js代码
  
var oPerson = new Object;   
oPerson.name = "zs";   
oPerson.sex = 'boy';   
oPerson.birthday = '2001-02-03';   
oPerson.sayHi = function()   
{   
   alert("Hi ! I am "+this.name);   
}  

那么我们要多创建几个人,怎么办呢?就得再写几个Object,那得哭死,那么怎么办呢?看下面的几种解决方案:



下面的最终解决方案可能不是最佳,但是我目前的水平,是觉得最佳的,欢迎指教

Js代码 
 
functon createPerson(name,sex,birthday)   
{   
  var oPerson = new Object;   
  oPerson.name =name;   
  oPerson.sex = sex;   
  oPerson.birthday = birthday;   
    
 oPerson.sayHi = function()   
 {   
    alert("Hi ! I am "+this.name);   
 }   
  return oPerson;   
}   
  
//那么我们多创建几个人的话,就可以   
var person1 = new createPerson('zs','boy','2001-02-03');   
var person2 = new createPerson('ls','boy','2001-02-04');   
person1.sayHi();   
person2.sayHi();  


    看上去,似乎解决了,但是问题是 你创建几个人就创建了几个sayHi行为,但是他们都是一个功能,怎么办呢?JS的灵活造就了下面的解决方法,把方法作为一个对象的属性:

Js代码
   
function sayHi()   
{   
 alert("Hi ! I am "+this.name);   
}   
  
functon createPerson(name,sex,birthday,fn)   
{   
  var oPerson = new Object;   
  oPerson.name =name;   
  oPerson.sex = sex;   
  oPerson.birthday = birthday;   
  oPerson.sayHi = sayHi;//这里是个函数引用   
  return oPersn;   
}   
var person1 = new createPerson('zs','boy','2001-02-03');   
var person2 = new createPerson('ls','boy','2001-02-04');   
person1.sayHi(); //outputs "Hi ! I am zs"   
person2.sayHi(); //outputs "Hi ! I am ls"  
function sayHi()

问题似乎解决了,但是,你参见prototype就会发现人家有更高明的解决方案,所有函数只创建一次,而每个对象都具有自己的对象属性实例,看下面的代码:

最终方案

Js代码
   
functon CreatePerson(name,sex,birthday,fn)   
{   
  this.name =name;   
  this.sex = sex;   
  this.birthday = birthday;   
}   
CreatePerson.prototype.sayHi = function ()   
{   
  alert("Hi ! I am "+this.name);   
}   
  
var person1 = new CreatePerson('zs','boy','2001-02-03');   
var person2 = new CreatePerson('ls','boy','2001-02-04');   
person1.sayHi(); //outputs "Hi ! I am zs"   
person2.sayHi(); //outputs "Hi ! I am ls"   
  
一般情况下,一个对象或者类不只一个方法,需要多个方法配合使用,那么   
CreatePerson.prototype={   
  sayHi:function()   
  {   
    alert("Hi ! I am "+this.name);   
  },   
  walk:function()   
  {   
    alert("walk,walk");   
  },   
  ……   
}   

是不是优雅的多?
 
    昨天写了一半,看到同志们回复是javascript高级程序设计上的,我要说的是对,确实是来源于上面,我就不废话了,中间省掉了很多循序渐进的引导,如:工厂模式、构造函数方式、原型方式、混合的构造方法/原型方式、动态原型方式、混合工厂模式。希望想学好JS的同志们回头多看看这些,会明白很多“为什么”。



  呵呵,炫丽背后其实很朴实。

分享到:
评论

相关推荐

    焦点图封装(js封装类,javascript,焦点图,图片切换)

    焦点图封装(js封装类,javascript,焦点图,图片切换)

    Js图片相册展示封装类_javascript编程

    JavaScript图片相册展示封装类是一种高效且便捷的方式来在网页中展示图像集合,它通常包括了图片的加载、显示、切换、缩放等核心功能。在本文中,我们将深入探讨JavaScript编程在创建此类封装类时涉及的关键知识点,...

    发布一个实用的js window封装类

    标题中的“发布一个实用的js window封装类”指的是在JavaScript编程中,开发者为了提高代码的可维护性和复用性,通常会将一些常用的全局对象,如`window`,进行封装,形成一个自定义的类。这个类会包含`window`对象...

    用javascript写的计算器,封装成对象了(带用例)

    在JavaScript编程中,将功能封装成对象是一种常见的代码组织方式,可以提高代码的复用性和可维护性。在这个场景中,我们讨论的是一个基于JavaScript实现的计算器,它已经被封装为一个对象,便于调用和使用。以下是这...

    推荐通用文字图片JS不间断滚动封装类 代替Marquee

    标题提到的"推荐通用文字图片JS不间断滚动封装类 代替Marquee",就是一种利用JavaScript实现的动态效果,它旨在为文字和图片提供一种类似传统的Marquee(滚动条)效果,但更加灵活且易于使用的解决方案。Marquee是...

    Javascript效果封装类(都是国外高手写的)

    在本压缩包中,我们收集了国外JavaScript高手编写的封装类,这些类库和函数集旨在简化常见的特效实现,提高代码复用性和可维护性。下面将详细介绍其中涉及的一些关键技术点。 1. **类与封装**: - 在JavaScript中...

    js定义类 对象 构造函数,类的继承

    通过分析这个文件,我们可以看到实际应用中的类定义和继承实践,包括如何定义类,如何使用构造函数初始化对象,以及如何通过`extends`关键字实现类的继承和覆盖或扩展父类的方法。 总结一下,JavaScript的类、对象...

    滑动门(js封装类,javascript,选项卡,滑动门,tag) 通用滑动门

    滑动门(js封装类,javascript,选项卡,滑动门,tag) 通用滑动门

    Javascript:通用不间断滚动&省、市、地区联动选择JS封装类

    在本主题中,我们关注的是“通用不间断滚动”和“省、市、地区联动选择”的JS封装类,这两个功能常见于许多网站,尤其是电商或者需要用户填写详细地址的平台。 “通用不间断滚动”通常用于实现页面元素如新闻滚动条...

    YMDClass年月日三级联动纯JS封装类精简插件

    总结起来,"YMDClass年月日三级联动纯JS封装类精简插件"是一个高效、轻量级的日期选择解决方案,适用于那些希望在不依赖外部库的情况下提供良好用户体验的网页开发者。通过简单的配置和调用,开发者可以轻松地在他们...

    省、市、地区联动选择JS封装类.rar

    在这个名为"省、市、地区联动选择JS封装类.rar"的压缩包中,很可能包含了一个用JavaScript编写的类或函数库,用于实现这种联动效果。通常,这样的库会包含以下关键知识点: 1. **数据结构**:为了实现联动,首先...

    MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类)

    **MSClass - 通用不间断滚动JS封装类** 在网页设计中,滚动效果是常见的动态元素,可以用于展示图片、文字等内容。MSClass 是一个专门针对此类需求开发的JavaScript类,它实现了通用的不间断滚动功能,适用于多种...

    javascript面向对象包装类Class封装类库剖析.docx

    JavaScript中的面向对象编程是语言的核心特性之一,但与传统的面向对象语言如Java或C++有所不同。JavaScript采用基于原型(Prototype)的继承机制,而非类(Class)为基础的继承。这使得JavaScript在处理对象和类的...

    js跨域对象类

    JavaScript跨域对象类是一种在Web开发中解决同源策略限制的技术。同源策略是浏览器为了保护用户数据安全而设定的一项安全政策,它规定了只有来自相同域名的HTTP请求才能互相访问资源,不同源的请求会被阻止。然而,...

    处理emoji表情 js unicode转码解码方法封装类,自己项目中使用的东西

    处理emoji表情 js unicode转码解码方法封装类,自己项目中使用的东西 处理emoji表情 js unicode转码解码方法封装类,自己项目中使用的东西

    js获取对象,数组所有属性键值(key)和对应值(value)的方法示例

    在JavaScript编程中,获取对象和数组的属性键值(key)和对应值(value)是一项基本操作。本文将详细介绍如何实现这一功能,并提供相应的代码示例。 首先,我们需要理解JavaScript中的对象和数组。对象是一种键值对...

    JavaScript对象封装与单元测试.pdf

    JavaScript对象封装与单元测试 JavaScript对象封装是指将JavaScript代码组织成一个对象的形式,以便于测试和维护。单元测试是软件测试的一种,目标是确保每个单元的正确性。在JavaScript开发中,单元测试是非常...

    js将类数组对象转换成数组对象

    通过使用这些库中的转换方法,我们可以弥补JavaScript在处理类数组对象上的不足,使得各种不同的对象在不同的浏览器中都能得到一致的处理,从而提升代码的兼容性和可用性。在实践中,根据所使用的库的不同,选择合适...

Global site tag (gtag.js) - Google Analytics