Javascript学习------设计模式(1)

由于初次看《javascript设计模式》,有太多的疑问:

1.接口:提供必需实现的方法的类,但本类不需要具体实现(C#搬过来的)

 1         ///1:注释方实现接口
 2         var compositeform = function () {//继承接口
 3
 4         }
 5         compositeform.prototype.add = function () {//实现接口中的添加方法
 6
 7         }
 8         compositeform.prototype.delete = function () {//实现接口中的删除方法
 9
10         }
11
12         ///:属性法实现接口
13         var comform = function () {
14             this.implementsInteerfaces = [‘Composite‘, ‘FormItem‘];
15         }
16         function addForm(formInstance) {
17             if (!implements(formInstance, ‘Composite‘, ‘FormItem‘)) {
18                 throw new error("对象没有实现所需的接口。")
19             }
20         }
21         function implementss(object) {
22             for (var i = 1; i < arguments.length; i++) {
23                 var interfaceName = arguments[i];
24                 var interfaceFound = false;
25                 for (var j = 0; j < object.implementsInteerfaces.length; j++) {
26                     if (object.implementsInteerfaces[j] == interfaceName) {
27                         interfaceFound = true;
28                         break;
29                     }
30                 }
31                 if (!interfaceFound) {
32                     return false;//接口没有被发现
33                 }
34             }
35             return true;//接口被发现
36         }
37
38         ///:鸭式辨型模仿接口
39         var Composite = new Interface(‘Composite‘, [‘add‘, ‘remove‘, ‘getchild‘]);
40         var FormItem = new Interface(‘FormItem‘, [‘save‘]);
41
42         var CompositeForm = function (id, method, action) {
43
44         }
45         function addform(forminstance) {
46             ensureImplements(formInstance, Composite, FormItem);
47         }
48
49
50
51         var Interface = function (name, methods) {
52             if (arguments.length != 2) {
53                 throw new error(‘创建接口失败‘);
54             }
55             this.name = name;
56             this.methods = [];
57             for (var i = 0, len = methods.length; i < len; i++) {
58                 if (typeof methods[i] !== ‘string‘) {
59                     throw new error("接口方法是字符串型");
60                 }
61                 this.methods.push(methods[i]);
62             }
63         }
64
65         Interface.prototype.ensureImplements = function (object) {
66             if (arguments.length < 2) {
67                 throw new error("确保能实现接口方法请传入至少2个,且符合要求的参数");
68             }
69             for (var i = 1, len = arguments.length; i < len; i++) {
70                 var interfaces = arguments[i];
71                 if (interfaces.constructor !== Interface) {
72                     throw new error("函数的参数interface.esureimplements希望从两个and above to be of接口实例");
73                 }
74                 for (var j = 0, methodsLen = interfaces.methods.length; j < methodsLen; j++) {
75                     var method = interfaces.methods[j];
76                     if (!object[method] || typeof object[method] !== ‘function‘) {
77                         throw new error(‘‘);
78                     }
79                 }
80             }
81         }

以上代码只是照搬书上的,基本就是模仿面向对象语言里接口的功能(继承接口必需实现接口里的方法,但并没有验证方法参数,原因javascript的参数类型object 可是任何类型)



2.私有属性、私有方法与静态属性、静态方法(书上是都是使用闭包实现)

根据书中所讲,我所理解的意思(只是个人理解)

私有:类中的公共方法,操作类中局部变量或方法;(每个实例都是存在私有成员独立占用内存)

 1        var Books = function (newisbn, newtitle, newauthor) {
 2             var isbn = "abc", title, author;//局部变量(即私有变量)
 3             function select(str) {
 4                 isbn += str;
 5             }//局部方法(即私有方法)
 6             this.getIsbn = function () {
 7                 this.isbn = isbn;
 8             };
 9             this.getTitle = function () {
10                 this.isbn = title;
11             };
12             this.getAuthor = function () {
13                 this.isbn = author;
14             };
15             this.fn = function (str) {
16                 select(str);
17             };
18         }
19         var book = new Books();
20         book.fn("def");
21         book.getIsbn();
22         alert(book.isbn);//abcdef
23         var book1 = new Books();
24         book1.fn("ghi");
25         book1.getIsbn();
26         alert(book1.isbn);//abcghi

静态:静态成员关联类本身,而不是类实例后(用我的话来说,就是类的全局成员,在内存中只占一次,类实例共享的)

 1     var Books = function (newisbn, newtitle, newauthor) {
 2             var isbn = "abc", title, author;//类全局变量(即静态变量)
 3             function select(str) {
 4                 isbn += str;
 5             }//类全局方法(即静态方法)
 6             return function () {//闭包
 7                 this.getIsbn = function () {
 8                     this.isbn = isbn;
 9                 };
10                 this.getTitle = function () {
11                     this.isbn = title;
12                 };
13                 this.getAuthor = function () {
14                     this.isbn = author;
15                 };
16                 this.fn = function (str) {
17                     select(str);
18                 };
19             }
20         }();//括号很重要
21         var book = new Books();
22         book.fn("def");
23         book.getIsbn();
24         alert(book.isbn);//abcdef
25         var book1 = new Books();
26         book1.fn("ghi");
27         book1.getIsbn();
28         alert(book1.isbn);//abcdefghi

常量:创建只有取值器而没赋值器的么用变量模仿常量即可

3.继承

 //1.原型链继承
        var yuwen = function () {
        }
        yuwen.prototype = new Books();//设置原型链(实现继承)
        yuwen.prototype.constructor = yuwen;//重新设置(因为在设置prototype是消失了,书上是这样说的)
        yuwen.prototype.getBooks = function () {
            return this.books;
        }
        var w = new yuwen();
        alert(w.name2);//打印得外语 name2的属性得到

        //2.call对象冒充继承
        var shuxue = function () {
            Books.call(this);//对象冒充,即Books中的this变更为现在yuwem对象(实现继承)
        }
        var s = new shuxue();
        alert(s.name2);//打印得外语 name2的属性得到

3.单体模式(划分命名空间)

1 var GiantCorp = {};//命名空间
2         GiantCorp.common = {
3             inti: function () { },
4             pageend: function () { }
5         }
6         GiantCorp.index = {
7             inti: function () { },
8             pageend: function () { }
9         }

4方法链接调用(Jquery使用的方法)

 1         (function () {
 2             function _$(els) {
 3                 if (typeof arguments[0][0] === ‘function‘) {
 4                     window.onload = arguments[0][0]();
 5                     return;
 6                 }
 7                 this.elements = [];
 8                 for (var i = 0, len = els.length; i < len; ++i) {
 9                     var element = els[i];
10                     if (typeof element === ‘string‘) {
11                         element = document.getElementById(element);
12                     }
13                     this.elements.push(element);
14                 }
15             }
16             _$.prototype = {
17                 each: function (fn) {
18                     for (var i = 0, len = this.elements.length; i < len; i++) {
19                         fn.call(this.elements[i], i)
20                     }
21                     return this;
22                 },
23                 html: function () {
24                     for (var i = 0, len = this.elements.length; i < len; i++) {
25                         return this.elements[i].innerHTML;
26                     }
27                 }
28             }
29             window.$ = function () {
30                 return new _$(arguments);
31             }
32         })();
33     </script>
34     <span id="sp">s_s</span>
35     <span id="sp2">s-s</span>
36     <script type="text/javascript">
37         $(function () {
38             $("sp", "sp2").each(function (i) {
39                 alert(i);
40             });
41             alert($("sp").html());
42         });
43     </script>

以上就是我学习《JavaScript 设计模式》的上半部分,虽然只是初浅的学习了一遍,但学到的东西还是有的,我相信下一次再学习这部分内容时能理解的更多!

时间: 2024-10-23 09:27:52

Javascript学习------设计模式(1)的相关文章

56本前端工程师必备的javaScript学习书籍

分享56本前端工程师必备的javaScript学习书籍(包括了pdf,chm,doc) 1.JavaScript权威指南(第6版)(中文版)2.深入浅出Javascript.O‘reilly.Head.First.Javascript.Jan.20083.JavaScript王者归来月影扫描版4.JavaScript.DOM高级程序设计贝斯扫描版5.精通javascript(图灵计算机科学丛书)6.JavaScript面向对象15分钟教程7.原型.作用域.闭包的完整解释8.Javascript面

【吐血推荐】牛人收集的163个Javascript学习教程pdf电子书资源合集

不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pdf 274.79 KB   21天学通JavaScript(第2版)-顾宁燕扫描版.pdf 26.02 MB   5天驾驭JQuery教程.pdf 1.08 MB   ACCP软件开发初级程序员-使用Javascript增强交互效果-北大青鸟.pdf 51.70 MB   Ajax+PHP程序设计实战详解.pdf 84.29 MB   Ajax实战中文版.pdf 2.48 MB   Aj

javascript学习

javascript 学习 title: Javascripttags: javascript,学习grammar_cjkRuby: true--- 定义变量 三种形式 var name; var name = "zhang san"; var name; name = "zhang san"; Javascript 的数据类型 6种数据类型 字符串单引号或双引号 var name = "zhang san"; var name = 'zhang

Javascript 学习笔记 2: 标识语句

可以在任何语句声明之前使用唯一标识(identifier)和冒号(:)用来标记该语句: identifier: statement 这样,你可以在程序的任何其他地方通过标识来使用这个语句.即使在语句内部也可以使用该语句的标识(例如:循环语句和条件语句).当在一个循环语句前添加一个标识,你可以在语句内部通过break 标识来退出当前循环,也可以通过continue标识来继续执行该语句.例如: mainloop: while(token != null) { // Code omitted... c

JavaScript学习之DIV层与图像

DIV层与图像 一.设计一个可定位的层 1.设置位置(position)和大小 (1)绝对定位(absolute):以页面边框为参照,只要设置好绝对位置,那么元素的位置会始终固定在距离边框某个位置的距离. 绝对定位有两个属性:left和top,分别是距离网页左边和网页顶部的绝对位置,可借助style属性直接设置: style="position:absolute;left:距离左边距离;top:距离顶部距离" (2)相对定位(relative):需要有一个参照元素,设置好相对位置和参照

JavaScript学习05 定时器

JavaScript学习05 定时器 定时器1 用以指定在一段特定的时间后执行某段程序. setTimeout(): 格式:[定时器对象名=] setTimeout(“<表达式>”,毫秒) 功能:执行<表达式>一次. 例子: <!DOCTYPE html> <html> <head> <title>timer1.html</title> <meta http-equiv="keywords" co

如何学习设计模式

GoF的[设计模式]是经典著作,有人看了好多遍仍然说没有看懂,许多人看懂了一些模式但不知道如何应用--这里,yqj2065抛砖引玉,讨论一下如何学习设计模式. ①    学习技巧 学习设计模式时,有一些技巧能够帮助你快速理解设计模式. a)        使用较简单的面向对象的语言如Java.C#.GoF的[设计模式]实质上是面向对象的设计模式.[GoF·1.1]中提到"程序设计语言的选择非常重要,它将影响人们理解问题的出发点".从学习设计模式的角度看,Java和C#较C++更容易一些

Javascript学习--------认识window窗口对象

window对象: Window 对象表示浏览器中打开的窗口. 可以通过window对象设置窗口的大小,位置等. 还可以控制是否加载网页等. window对象集合: 集合 描述 frames[] 返回窗口中所有命名的框架. 该集合是 Window 对象的数组,每个 Window 对象在窗口中含有一个框架或 <iframe>.属性 frames.length 存放数组 frames[] 中含有的元素个数.注意,frames[] 数组中引用的框架可能还包括框架,它们自己也具有 frames[] 数

Javascript学习------FileSystemObjec对象

动态创建FileSystemObject对象: var fso=new FileSystemObject("Scripting.FileSystemObject"); (接下来可以用变量fso对Drive对象.Drives集合.File对象.Files集合.Folder对象.Folders集合以及TextStream对象进行相应的操作.) FileSystemObject对象的方法 ·GetAbsolutePathName()方法:该方法根据提供的路径返回完整的路径. ·GetBase