js面向对象编程

xiaoxiao2021-02-28  99

最近很在意自己的代码问题,想要进一步优化自己的代码,为了更符合编程思维,我觉得面向对象写法是很好的方式,这里不会涉及JS的原型链的问题,因为我个人还未去深入了解。这里只讲一讲OO。

目前我写的风格,以及看到的很多代码,都是以JSON对象来处理的。例如

window.ks={ name:'JOY', getname:function(){ return this.name; }, setname:function(name) { this.name=name; } } console.log(ks.getname());//输出JOY ks.setname('xxx'); console.log(ks.getname());//输出xxx

上面的写法一般就是全局的对象,单实例,如果我们希望能够处理多个实例(对象)呢?JSON是否也能处理,我们写以下代码来看看:

//是否可以通过声明不同的变量来区分对象?答案很明显是不可以的,因为这种写法只是引用 var a=ks; var b=ks; a.setname('xx'); b.setname('xy'); console.log(a.getname()); console.log(b.getname()); //number,string类型都是基本类型,而基本类型存放在栈区,访问时按值访问,赋值是按照普通方式赋值; //对象和数组是通过引用来赋值的,所以改变a的同时b也会跟着改变,他们都指向ks对象,当然ks对象的值改变,a,b也会改变,那么这种情况我们就无法同时处理两个以上的实例,比如,如果我的页面中有两个轮播插件,如果我要同时控制这两个插件,就不能用JSON这种形式来写,而要用new的形式来处理,一般现在看到的JQ插件之类的很多都是以这种形式写的,所以一般插件只能针对一个对象或元素使用

而且有一点要注意的是想JSON对象这种形式存在,我们必须一开始就加载这个数据,如果是OO的写法,我们在需要的时候才去new一个实例。这样能够节约资源

下面是我在论坛中帮别人改的例子,他想知道怎样才是“封装“,而在此引入了面向对象这个概念来说,他的源代码是这样的:

function packageFun() { var length = 0; change = setInterval(function () { length++; if (length == $("#FirstPage li").length) { length = 0; } show(length); }, 5000); function show(length) { $("#FirstPage li").eq(length - 1).fadeOut(1000); //将上一张图片隐藏 $("#FirstPage li").eq(length).fadeIn(1000); //将这张图片出现 }; } packageFun();

改完后:

function packageFun() { var li_length = $("#FirstPage li").length;//作为该类的私有变量,如果放在setinterval中,每次都要去查找,就没必要了 var cur_length = 0; this.change = setInterval(function() {//凡是带有this的成员方法或属性都是可以在外部调用的,而var声明的则为私有变量 cur_length++; if(cur_length == li_length) { cur_length = 0; } show(cur_length); }, 1000); var show = function(length) { $("#FirstPage li").eq(length - 1).fadeOut(1000); //将上一张图片隐藏 $("#FirstPage li").eq(length).fadeIn(1000); //将这张图片出现 } } var T = new packageFun(); console.log(T.change); //这里输出setinterval的ID

上面改写的代码只是为了让他体会一下大致的写法,这样写并不灵活,复用性也不高,所以我给他的建议是这样的:

上面的写法还不是特别符合实际的情况,有种为了面向对象而面向对象的感觉,但起码看上去是这么一回事,要想写好封装,实际上你应该根据实际的需求来封装,比如你想做的是图片轮播,你应该要确定你这个图片轮播的对象应该具备哪些属性和方法,正如你用change来记录ID一样,你肯定希望能主动停止执行函数,那么你大致可以在里面写几个方法或属性: 属性:返回当前对象的setInterval的ID 方法:1 设置setInterval的循环执行的时间 2 结束轮播 3 开始轮播 所以我上面的写法你可以再进一步修改
转载请注明原文地址: https://www.6miu.com/read-40060.html

最新回复(0)