转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25080573
js中处处是对象,面向对象的第一步当然就是封装了,由于Js中没有类的概念,所以封装起来也比较麻烦,下面介绍两种js的封装。
1、使用约定优先的原则,将所有的私有变量以_开头
<script type="text/javascript">
/**
* 使用约定优先的原则,把所有的私有变量都使用_开头
*/
var Person = function (no, name, age)
{
this.setNo(no);
this.setName(name);
this.setAge(age);
}
Person.prototype = {
constructor: Person,
checkNo: function (no)
{
if (!no.constructor == "string" || no.length != 4)
throw new Error("学号必须为4位");
},
setNo: function (no)
{
this.checkNo(no);
this._no = no;
}, getNo: function ()
{
return this._no;
}, setName: function (name)
{
this._name = name;
}, getName: function ()
{
return this._name;
}, setAge: function (age)
{
this._age = age;
}, getAge: function ()
{
return this._age;
}, toString: function ()
{
return "no = " + this._no + " , name = " + this._name + " , age = " + this._age;
}
};
var p1 = new Person("0001", "鸿洋", "22");
console.log(p1.toString()); //no = 0001 , name = 鸿洋 , age = 22
p1.setNo("0003");
console.log(p1.toString()); //no = 0003 , name = 鸿洋 , age = 22
p1.no = "0004";
p1._no = "0004";
console.log(p1.toString()); //no = 0004 , name = 鸿洋 , age = 22
</script>
看完代码,是不是有种被坑的感觉,仅仅把所有的变量以_开头,其实还是可以直接访问的,这能叫封装么,当然了,说了是约定优先嘛,这种方式还是不错的,最起码成员变量的getter,setter方法都是prototype中,并非存在对象中,总体来说还是个不错的选择。如果你觉得,这不行,必须严格实现封装,那么看第二种方式。
2、严格实现封装
<script type="text/javascript">
/**
* 使用这种方式虽然可以严格实现封装,但是带来的问题是get和set方法都不能存储在prototype中,都是存储在对象中的
* 这样无形中就增加了开销
*/
var Person = function (no, name, age)
{
var _no , _name, _age ;
var checkNo = function (no)
{
if (!no.constructor == "string" || no.length != 4)
throw new Error("学号必须为4位");
};
this.setNo = function (no)
{
checkNo(no);
_no = no;
};
this.getNo = function ()
{
return _no;
}
this.setName = function (name)
{
_name = name;
}
this.getName = function ()
{
return _name;
}
this.setAge = function (age)
{
_age = age;
}
this.
getAge = function ()
{
return _age;
}
this.setNo(no);
this.setName(name);
this.setAge(age);
}
Person.prototype = {
constructor: Person,
toString: function ()
{
return "no = " + this.getNo() + " , name = " + this.getName() + " , age = " + this.getAge();
}
}
;
var p1 = new Person("0001", "鸿洋", "22");
console.log(p1.toString()); //no = 0001 , name = 鸿洋 , age = 22
p1.setNo("0003");
console.log(p1.toString()); //no = 0003 , name = 鸿洋 , age = 22
p1.no = "0004";
console.log(p1.toString()); //no = 0003 , name = 鸿洋 , age = 22
</script>
看上面的代码,去掉了this.属性名,严格的实现了封装,只能通过getter,setter访问成员变量了,但是存在一个问题,所有的方法都存在对象中,增加了内存的开销。
3、以闭包的方式封装
<script type="text/javascript">
/**
* 使用这种方式虽然可以严格实现封装,但是带来的问题是get和set方法都不能存储在prototype中,都是存储在对象中的
* 这样无形中就增加了开销
*/
var Person = (function ()
{
var checkNo = function (no)
{
if (!no.constructor == "string" || no.length != 4)
throw new Error("学号必须为4位");
};
//共享变量
var times = 0;
return function (no, name, age)
{
console.log(times++); // 0 ,1 , 2
var no , name , age;
this.setNo = function (no)
{
checkNo(no);
this._no = no;
};
this.getNo = function ()
{
return this._no;
}
this.setName = function (name)
{
this._name = name;
}
this.getName = function ()
{
return this._name;
}
this.setAge = function (age)
{
this._age = age;
}
this.
getAge = function ()
{
return this._age;
}
this.setNo(no);
this.setName(name);
this.setAge(age);
}
})();
Person.prototype = {
constructor: Person,
toString: function ()
{
return "no = " + this._no + " , name = " + this._name + " , age = " + this._age;
}
}
;
var p1 = new Person("0001", "鸿洋", "22");
var p2 = new Person("0002", "abc", "23");
var p3 = new Person("0003", "aobama", "24");
console.log(p1.toString()); //no = 0001 , name = 鸿洋 , age = 22
console.log(p2.toString()); //no = 0002 , name = abc , age = 23
console.log(p3.toString()); //no = 0003 , name = aobama , age = 24
</script>
上述代码,js引擎加载完后,会直接执行Student = 立即执行函数,然后此函数返回了一个子函数,这个子函数才是new Student所调用的构造函数,又因为子函数中保持了对立即执行函数中checkNo(no) ,times的引用,(很明显的闭包)所以对于checkNo和times,是所有Student对象所共有的,创建3个对象后,times分别为0,1,2 。这种方式的好处是,可以使Student中需要复用的方法和属性做到私有且对象间共享。
分享到:
相关推荐
Vue.js 初步进阶案例,适合vue入门者进阶 旅游APP,为喜欢旅游的人专业提供旅游攻略,致力提升旅游体验。路由懒加载,进入页面前登录判断,返回导航判断,RestAPI接口使用,组件封装,Vuex状态封装,keep-alive页面...
vue封装axios的几种方法 目录 基础版第一步:配置axios 第二步:封装请求 第三步:使用 进阶版 基础版 第一步:配置axios 第二步:封装请求 第三步:使用 第一步:配置axios 第二步:封装请求 第三步:...
基础篇: 主要包括JavaScript和HTML的基础知识链接: 进阶篇: 主要是对JavaScript一些封装库的讲解链接: 高级篇: 主要是一些项目设计模式和Html5游戏开发的讲解链接:
路由懒加载,进入页面前登录判断,返回导航判断,RestAPI接口使用,组件封装,Vuex状态封装,keep-alive页面缓存等
采用JavaScript面向对象思想封装拖拽移动功能,兼容pc端和移动端,适合JavaScript初学者进阶学习。
JavaScript进阶学习 面向对象 编程思想 面向过程(POP:process-oriented programming)分析出解决问题的步骤。 面向对象(OOP:object oriented programming)将事物分析成对象,然后由对象进行分工合作。 面向对象的优点...
适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究...
*使用了Ajax异步刷新,封装Jquery,使用了图片的IO上传等技术 *建议使用Tomcat9和jdk8 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关...
概述 Vue 在插入、更新或者移除 DOM 时,提供多种...Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加 entering/leaving 过渡 条件渲染 (使用 v-if) 条件展示 (使用 v-show) 动态组件
Angular2采用AOT静态编译模式,这种形式下需要我们的模板类型必须是稳定和安全的,直接使用javascript和jquery语言是不稳定,因为他们的编译不会提前发现错误,所以angular2才会选择javascript的超集typescript语言...
主要介绍了使用AngularJS编写较为优美的JavaScript代码指南,包括控制器和封装等进阶技巧上的编程建议,倾力推荐!需要的朋友可以参考下
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
领先的 Web 技术教程 - 全部免费,在 w3school,你可以找到你所需要的所有的网站建设教程。 从基础的 HTML 到 CSS,乃至进阶的XML、SQL、JS、PHP 和 ASP.NET。...2014年1月23日封装,祝大家小年快乐!
适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究...
第二十七章:JavaScript进阶 521 学习目标 521 基于对象的JavaScript语言 522 对象的基础知识 522 this关键词 523 new运算符 523 常用对象的属性和方法 525 算术函数的math对象 527 创建新对象 529 JavaScript中的...
我是辰兮,很高兴你能来阅读,本章初识jQuery,用案例详细的讲解了jQuery的DOM操作,每一个操作都有详细的案例以及截图,希望对你有帮助,分享获取新知,大家一起进步。...它封装JavaScript常用的功能代码,提供一种
记录工作和学习中的总结和经验。 深入原生 前端框架 全栈开发 NodeJs 技术栈思维导图汇总 Koa 原理分析,中间件机制“洋葱模型” ...写给自己的知识体系和前端进阶路线 前端基础工程化体系建设历程 二零二零年度总结
欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!...
而进阶一些的前端开发者一定熟悉 TypeScript . 本项目用于我个人日常刷 时记录刷题的过程, 并根据需要不断地提供一些工具类(目前只有一个测试相关的). :sparkles: 特性 使用TypeScript 封装了一个测试函数, 允许你...
5.5.2 pageContext封装对象 5.5.3 其他的JSP内置对象 5.6 JSP标签 5.6.1 插入标签 5.6.2 转发标签 5.6.3 传参标签 5.6.4 创建:Bean标签 5.6.5 设置属性值标签 5.6.6 获取属性值标签 5.7 JSP的...