javascript中面向对象的写法比普通函数封装的写法好在哪里?
下面这段代码用了两种方式写的,可以得到同样的结果,麻烦问下前者比后者好在哪里?
我唯一知道的好处是前者在同一个页面调用两次的话,由于原型的特性,原型方法只占用一份内存,节省资源。
<script type="text/javascript">
//面向对象
function Person (name,age,work) {
this.name=name;
this.age=age;
this.work=work;
}
Person.prototype.showName=function () {
alert(this.name);
}
Person.prototype.showAge=function () {
alert(this.age);
}
Person.prototype.showWork=function () {
alert(this.work);
}
var tmp=new Person('Tom','man','web');
tmp.showName();
tmp.showAge();
tmp.showWork();
// 普通函数封装
function fn1 (name,age,work) {
alert(name);
alert(age);
alert(work);
}
fn1('Tom','man','web');
</script> 展开
var 学员资料=new Array()
var 某某人=new function(){
this.name="张三"
this.身高=1.8
this.发型="小平头"
this.入学=function(){学员资料[学员资料.lenght]=this}
}
document.write ("名字:"+某某人.name +"|身高:" + 某某人.身高掘戚+"|发型:"+某某人.发型)
那么就得到 某某人的具体信息
而且采用:
某某人.入学() 这个就是直接登记到学员资料中去了,不需要通过其他函数和复杂的步骤
我认为优点在于
1:直观性
采用 . 表示 "的" 的意思,可以表示下属成员 所含内容 ,甚至可以用 .parent 来表示对 父对象的引用
2:易用性
对象存在,内存中的变量也存在,不需要中间变量
可建立方法函数在内置函数中,内置函数的变量和方法函数的变量是临时的,不中散闷产生名称冲突
执行自身的方法,不需要额外的函数
3:扩展性
可以用对象的方式建立自定义的功能组件
类似Math这样的对象,这类对象具备自己的属性方法,在执行自定义方法中可以直接修改可能涉及关联的变量和自身的属性,而不需要像普通函数一样每次都可能要提取一定条件的变量,根据不同条件书写不同的函数
4:系统性
采用整体设计思路,形成系统对象或对象系统,可以方便的管理程序,页面元素,等等非常复杂的结构
简单的说,对象就是一个思维概念体
这个"体" 你能想到什么就建立什么
如果它是一个书本,你可以建立一个 this.翻页() 方法, 翻页中可能产生数据的变动 直接写在function中了
执行它, 他就翻页,相关数据的变动 就不需要管了,它的输出可以是一个对象,或者一个数组
换成普通函数,同样一个函数,就要调用很多变量,如果达到输出同样数据集的目的,那么还要设定一个集合变量
会很冗余
面向对卖弯象我理解就是这些
达到所见即可得,所建即可用的目的
,
我来说一说:
你所说的减少内存资源是一个明显的好处之外,另外还有一个不可忽视的好处,那就是代码分类明确。
这使得你在日常使用和修改的时候,能够快速便捷地找到你或别人开发的代码所在位置,以及方便地予以调用。
同时,由于JavaScript就本身而言,就是一个“对象型语言”,专业点说就是“面向对象”的语言种类。
它处处都是对象,一个字符串都是对象,比如下面的代码:
var re = "fdsa".replace("a", 'aaa');
alert(re);
输出:
fdsaaa
哦呵呵,是不是很有意凳亮思?
这个"fdsa"怎么它就拥有一个replace的方法呢?为什么?怎么这么奇怪?
没错,它就是一个对象,这个字符串本身就拥有replace方法,从而我们可以直接调用它。
然后我们再来看下面的代码:
//给JS内置的String类添加一个turn方法,这个方法是反转字符串
String.prototype.turn = function(){
var 誉渗arr=[];
var str = this.toString();
var p=str.length-1;
for(i=0; i<str.length; i++){
arr[p]=str.charAt(i);
p--;
}
return arr.join('');
}
//一个字符串,就拥有了turn方法,以后我们只要调用这个方法,就可以翻转字符串了!!
var re = 'fdsa'.turn();
alert(re);
输出:
asdf
很神奇吧?
可是,就算是这样的话,JS的对象对象编程所带来的好处还是没有完全讲明白,我们再举一个例子:
我们只要这样定义一个对象:
//定义一个名为obj的对象
var obj = {
//对象中的方法
al:function(str){
alert(str);
},
trun:function(str){
var arr=[];
var p=str.length-1;
for(i=0; i<str.length; i++){
arr[p]=str.charAt(i);
p--;
}
return arr.join('');
}
};
var re = obj.trun('fdsa');
obj.al(re);
弹窗提示:
asdf
同样,这个obj对象可以使用prototype来为其增加或修改属性和方法;
那么,当我们要建枣虚宽立一个“很大很大”的一个库,里面有各种类型的数据处理所需要的方法、属性等,这个时候,我们如果想起什么就写一个function,那么当我们这个文件达到几百KB的时候,你会发现,乱就一个字啊,找个函数是怎么写的来着?拉滚动条,找不到,然后用替换查找...
嗯,什么时候我们忘了曾经定义过一个变量或者一个function了,然后我们在里面又写了一个,突然控制台提示:“JavaScript”错误.....
可是,当我们从一开始,就对我们要写的这个“大的JS文件”进行分类整理,按照各种功能也行,各种类型分类也行,然后我们就像用一个主目录里有子目录一样,顺藤摸瓜地找到他们,还找不到?那说明你不会JS了。
听好多人说js面向对象在开发中用的并不多,一般都是开发游戏的公司用,请问是这样吗?
我都从来没有用过,一般都是函数封装一些常用的方法,开发时利用seajs框架套用这些方法,来防止命名重复的问题。
我做的都是小型网站,JS也不会特别多。是不是大型网站(例如:百度,网页,腾讯等等)一般都是面向对象开发?
是的,包括我自己开发JS在内,都是尽可能的使用面向对象。
因为JS面向对象实在太容易太简单太舒服了,就是达到100行+左右的代码,写面向对象都对得起JavaScript;
比如下面的这段代码:
var g = {
i:function(id){
return document.getElementById(id);
},
t:function(tN, obj){
if(obj) obj.getElementsByTagName(tN);
else return document.getElementsByTagName(tN);
}
}
//下面,我想用document.getElementById(id);这样的较长语句的时候,只要用:
g.i('myId').innerHMTL = '要写的文字';
你看看原生JS的用法:document.getElementById.....
长就一个字,那我们只要定义了这个短短的g的Object,
后面只要:
g.i('id');
就搞定了。
这也是面向对象;
其它的当然也有,不是一句两名就能说完的。
或许你会说,像Jquery这样的框架,使用的方法比你的还简单:$('#id')就OK了,是的,但我也只是打个比方,其实如果让一个刚刚使用JS的人来理解这两者:
g.i('id'); //获取ID
g.t('div'); //获取tag
这样容易理解,还是:
$('#id');
$('div');
这样容易理解?