Javascript设计模式学习(三)更多的高级样式

静态方法和属性

直接上代码吧

//静态成员的例子

var House = (function(){

//私有的静态属性

var numOfHouse = 0;

//私有的静态方法

function isValid(hid){

if (hid != null && hid != undefined & hid != "") {

return true;

}

else {

return false;

}

}

//返回构造器

return function(hid, hname, address){

//私有属性

var _hid, _hname, _address;

this.getHid = function(){

return _hid;

}

this.setHid = function(hid){

if (!isValid(hid)) {

_hid = hid;

}

}

this.getHname = function(){

return _hname;

}

this.setHname = function(hname){

_hname = hname || "暂无";

}

this.getAddress = function(){

return _address;

}

this.setAddress = function(address){

_address = address || "暂无";

}

numOfHouse++;

if (numOfHouse > 2)

throw new Error("House:Only 2 House can be created");

this.setHid(hid);

this.setHname(hname);

this.setAddress(address);

};

})();

//公共的静态方法

House.washWindow = function(){

alert("Window Washed!");

}

//Public ,non-privileged method

House.prototype = {

showHouse: function(){

document.getElementById("container").innerHTML += "静态楼盘:" + this.getHname() + "<br />";

}

}

//静态方法调用

function staticHouse(){

try {

var staticHouse1 = new House('123', 'HouseName - 第一个', 'Beijing');

alert(staticHouse1.getHname());

staticHouse1.showHouse();

var staticHouse2 = new House('123', 'HouseName - 第二个', 'Beijing');

alert(staticHouse2.getHname());

staticHouse2.showHouse();

var staticHouse3 = new House('123', 'HouseName', 'Beijing');

}

catch (e) {

alert(e);

}

}

利用之前学过的作用域以及Closures的方法,我们能够创建既能够被公共访问也能够被私有访问的静态成员。可以说,静态成员的操作都是在类层级上而不是实例层级上。上面例子中最关键的两点:一是构造器放在return中,另外一个是最后跟的一对空的括号,这就使得返回的构造器得到了立即的执行;

常量

常量不过就是不能改变的变量,在JavaScript中,我们可以通过创建私有的变量来模拟常量。

直接上代码吧,这个也比较容易看懂,为类定义了一些常量。

//常量的简单示例

var Class = (function(){

var CLASSNAME = "I'm Jack!";

var CREATEDATE = "I'm born on Sep 10!";

var HOMETOWN = "I'm from 北京";

var constants = {

HEIGHT:100,

WIDTH:400

}

this.getName = function(){

return CLASSNAME;

}

this.getConstants = function(name){

return constants[name];

}

return function(){

this.showName = function(){

alert(getName());

};

this.showConstant = function(name){

alert(getConstants(name));

}

};

})();

function useConstant(){

var cl = new Class();

cl.showName();

cl.showConstant("HEIGHT");

}

封装的好处:

    封装保证了内部数据的完整性,只允许访问器和存取器来访问数据,这样来保证对数据保存和返回的完整控制。这就减少了我们在其他地方对于数据合法性检查的代码。封装还可以使你的对象尽量的保持独立,这就减少了紧耦合,而这正是面向对象设计的最重要的一条原则。通过封装,你的代码的复用性提高了,而你可以很容易的把他们清理出去。

封装的坏处:

    由于内部的方法和变量都是隐藏的,所以对封装过的对象做单元测试变得困难。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

经典排序算法总结--冒泡、快排、插入、希尔、归并、选择

对纵向排列的关键字序列,按照自下而上的扫描方向对两两相邻的关键字进行比较, 若为逆序(k_j < k_j-1 ),则将两个记录交换位置; 重复上述扫描排序过...

1092
来自专栏deepcc

javaScript创建无边框iframe兼容ie

3545
来自专栏九彩拼盘的叨叨叨

JavaScript 标准风格指南

JavaScript 中的关键字有 var, const, let, if, else, case, break, while, for, function, ...

1042
来自专栏锦小年的博客

python学习笔记2.2-print函数以及格式化输出

上一节已经安装好运行环境以及各种库,接下来就要开始正式编程了。与国际接轨,接触一门语言的第一次编程,一定是在屏幕上打印“hello world”。python...

2635
来自专栏Golang语言社区

Go 语言常量

常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 常量的定义格式: cons...

3029
来自专栏Golang语言社区

Go语言的fmt包中文教程

Fmt包 import "fmt" 简介 ▾ Package fmt包含有格式化I/O函数,类似于C语言的printf和scanf。格式字符串的规则来源于C但更...

2586
来自专栏猿人谷

一个正则表达式测试(只可输入中文、字母和数字)

  在项目中碰到了正则表达式的运用,正则还是非常强大的,不管什么编程语言,基本上都可以用到。之前在用java时特别是对用户名或密码使用正则非常爽,写脚本上用正则...

7946
来自专栏Golang语言社区

Goalng下的反射模块reflect学习使用

注意:我们上面的示例是使用值类型进行进行反射构造的。如果是指针类型的话,我们需要使用reflect.Struct字段进行判断接口类型的Kind()方法

1693
来自专栏Pythonista

Go 语言常量

在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1。

721
来自专栏python百例

06-字符串使用基础

1132

扫码关注云+社区

领取腾讯云代金券