JavaScript基于对象编程

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

JavaScript基于对象编程

1、JavaScript变量/函数声明在代码执行之前被解析,并且变量声明优先级高于函数声明。

代码片段:

1

2

3

4

5

6

7

var   flag =   'test'   in   window;

if   (!flag){

       var   test = 1;

}

 

new   StringBuffer(   'test = '   ).append(test).toString();

执行结果:

test = undefined

2、JavaScript中的this关键字指向当前执行上下文对象。

代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

var   _this =   this   ;

var   id;

var   name;

function   User(){

       id = 110;

       this   .name =   'andy'   ;

       return   this   ;

}

 

var   userOject =   new   User();

var   _new_id = id;

var   _new_name = name;

var   _obj_id = userOject.id;

var   _obj_name = userOject.name;

 

var   userFunc = User();

var   _id = id;

var   _name = name;

var   _func_id = userFunc.id;

var   _func_name = userFunc.name;

 

 

new   StringBuffer(   '_this = '   ).append( _this ).

append(   ';userOject = '   ).append(userOject ).append(   ';_new_id = '   ).append(_new_id).append(   ';_new_name = '   ).append(_new_name ).

append(   ';_obj_id = '   ).append(_obj_id ).append(   ';_obj_name = '   ).append( _obj_name ).

append(   ';userFunc = '   ).append(userFunc ).append(   ';_id = '   ).append(_id ).append(   ';_name = '   ).append(_name).

append(   ';_func_id = '   ).append(_func_id ).append(   ';_func_name = '   ).append( _func_name).toString();

执行结果:

_this = [object Window]
userOject = [object Object]
_new_id = 110
_new_name = undefined
_obj_id = undefined
_obj_name = andy
userFunc = [object Window]
_id = 110
_name = andy
_func_id = 110
_func_name = andy

3、JavaScript中通过new关键字调用的函数才是构造函数。(在构造函数内部 - 也就是被调用的函数内 - this 指向新创建的对象 Object。)

代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

function   User(userName){

       this   .userName = userName;

       return   this   ;

}

var   zhengwei = User(   '郑伟'   );

var   andy =   new   User(   'andy'   );

 

new   StringBuffer(   'zhengwei.constructor = '   ).append(zhengwei.constructor).

append(   ';zhengwei instanceof User ='   ).append((zhengwei   instanceof   User)).

append(   ';andy.constructor = '   ).append(andy.constructor).

append(   ';andy instanceof User = '   ).append((andy   instanceof   User)).toString();

执行结果:

zhengwei.constructor = [object Window]
zhengwei instanceof User =false
andy.constructor = function User(userName){this.userName = userNamereturn this}
andy instanceof User = true

4、JavaScript中所有变量都是对象,除了两个例外 null 和 undefined。

代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

var   undefind_test =   'undefind'   in   window;

var   null_test =   'null'   in   window;

var   _undefind =   null   ;

 

var   undefind_toString;

try   {

       undefind_toString = undefind.toString();

}   catch   (e){

       undefind_toString = e;

}

 

var   null_toString;

try   {

       null_toString =   null   .toString();

}   catch   (e){

       null_toString = e;

}

 

var   boolean_toString =   false   .toString();

var   number_toString = (2..toString() || 2 .toString() || (2).toString());

var   array_toString = [1,2,3].toString();

 

new   StringBuffer(   'undefind_test = '   ).append(undefind_test).

append(   ';null_test = '   ).append( null_test).

append(   ';_undefind = '   ).append(_undefind).

append(   ';undefind_toString = '   ).append(undefind_toString).

append(   ';null_toString = '   ).append(null_toString).

append(   ';boolean_toString = '   ).append(boolean_toString).

append(   ';number_toString = '   ).append(number_toString).

append(   ';array_toString = '   ).append(array_toString).toString();

执行结果:

undefind_test = false
null_test = false
_undefind = null
undefind_toString = ReferenceError: undefind is not defined
null_toString = TypeError: null has no properties
boolean_toString = false
number_toString = 2
array_toString = 1,2,3

5、JavaScript的对象可以作为哈希表使用,主要用来保存命名的键与值的对应关系。使用对象的字面语法 - {} - 可以创建一个简单对象。这个新创建的对象从 Object.prototype 继承。

代码片段:

1

2

3

4

5

6

7

8

9

10

var   Person = {id :   '001'   , userName :   '郑伟'   };

Person.age = 28;

 

new   StringBuffer(   "Person = "   ).append(Person).

append(   ";Person.constructor = "   ).append(Person.constructor).

append(   ";(Person instanceof Object) = "   ).append((Person   instanceof   Object)).

append(   ";Person['id'] = "   ).append(Person[   'id'   ]).

append(   ";Person.userName = "   ).append(Person.userName).

append(   ";Person['age'] = "   ).append(Person[   'age'   ]).toString();

执行结果:

Person = [object Object]
Person.constructor = function Object() {[native code]
}
(Person instanceof Object) = true
Person['id'] = 001
Person.userName = 郑伟
Person['age'] = 28

6、JavaScript原型属性。(基于原型模型实现继承的对象最终形成原型链,新创建的对象的 prototype 被指向到构造函数的 prototype)

代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

var   Person =   function   (){};

Person.prototype =   new   Object();

// early binding -- Class template

Person.prototype.id =   '001'   ;

Person.prototype.userName =   '郑伟'   ;

Person.prototype.age = 28;

Person.prototype.say =   function   (){

       return   "[id = "   +   this   .id +   ", userName = "   +   this   .userName +   ",age = "   +   this   .age +   "]"   ;

}

 

var   person =   new   Person();

// later binding -- Instance template

/*person.id = '001'

person.userName = '郑伟';

person.age = 28;

person.say = function(){

       return "[id = " + this.id + ", userName = " + this.userName + ",age = " + this.age + "]";

}*/

var   _prototype_toString =   new   StringBuffer();

var   count = -1;

for   (   var   n   in   Person.prototype) {

       if   (count >= 0){

           _prototype_toString.append(   ","   );

       }

       _prototype_toString.append(n).append(   "="   ).append(Person.prototype[n]);

       count ++;

}

 

new   StringBuffer(   'Object.prototype = '   ).append(Object.prototype).

append(   ';Object.constructor = '   ).append(Object.constructor).

append(   ';Object.prototype.constructor = '   ).append(Object.prototype.constructor).

append(   ';(person instanceof Object) = '   ).append((Person   instanceof   Object)).

append(   ';person.constructor = '   ).append(Person.constructor).

append(   ";person.say() = "   ).append(person.say()).

append(   ";_prototype_toString = "   ).append(_prototype_toString.toString()).toString();

执行结果:

Object.prototype = [object Object]
Object.constructor = function Function() {[native code]
}
Object.prototype.constructor = function Object() {[native code]
}
(person instanceof Object) = true
person.constructor = function Function() {[native code]
}
person.say() = [id = 001, userName = 郑伟,age = 28]
_prototype_toString = id=001,userName=郑伟,age=28,say=function (){return "[id = " + this.id + ", userName = " + this.userName + ",age = " + this.age + "]"}

7、基于构造函数(对象冒充)实现JavaScript对象继承。(支持多重继承,不支持instanceof关键字,多层继承时调用层次过多)

代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

// Define baseClass.

function   BaseClass(id, name){

       this   .id = id;

       this   .name = name;

       this   .toString =   function   (){

           return   'id = '   +   this   .id +   ', name ='   +   this   .name;

       };

}

 

 

// Define subclass.

function   SubClass(){

       BaseClass.apply(   this   , arguments);

       this   .identifer = arguments[arguments.length - 1];

       this   .toString =   function   (){

           return   BaseClass.prototype.toString.call(   this   ) +   ', identifer = '   +   this   .identifer;

       };

}

 

var   subClass =   new   SubClass(1,   'subClass'   ,   '0001'   );

 

new   StringBuffer(   'subClass.toString() = '   ).append(subClass.toString()).

append(   ';subClass.constructor = '   ).append(subClass.constructor).

append(   ';(subClass.constructor  === SubClass) = '   ).append((subClass.constructor  === SubClass)).

append(   ';(subClass instanceof SubClass) = '   ).append((subClass   instanceof   SubClass)).

append(   ';(subClass instanceof BaseClass) = '   ).append((subClass   instanceof   BaseClass)).toString();

执行结果:

subClass.toString() = [object Object], identifer = 0001
subClass.constructor = function SubClass(){BaseClass.apply(this, arguments)this.identifer = arguments[arguments.length - 1]this.toString = function(){return BaseClass.prototype.toString.call(this) + ', identifer = ' + this.identifer}}
(subClass.constructor  === SubClass) = true
(subClass instanceof SubClass) = true
(subClass instanceof BaseClass) = false

8、基于原型(代码模板)实现JavaScript对象继承。(不支持多重继承,支持instanceof关键字,多层继承时模版复用)

代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

// Define baseClass

function   BaseClass(){}

BaseClass.prototype.id =   null   ;

BaseClass.prototype.name =   null   ;

BaseClass.prototype.toString =   function   (){

       return   'id = '   +   this   .id +   ', name ='   +   this   .name;

};

 

 

// Define subClass

function   SubClass(){}

SubClass.prototype =   new   BaseClass();

 

SubClass.prototype.identifer =   null   ;

SubClass.prototype.toString =   function   (){

       return   BaseClass.prototype.toString.call(   this   ) +   ', identifer = '   +   this   .identifer;

};

 

// The subclass is instanced.

var   subClass =   new   SubClass();

subClass.id = 1;

subClass.name =   'subClass'   ;

subClass.identifer =   '0001'   ;

 

// Output

new   StringBuffer(   'subClass.toString() = '   ).append(subClass.toString()).

append(   ';subClass.constructor = '   ).append(subClass.constructor).

append(   ';(subClass.constructor  === SubClass) ='   ).append((subClass.constructor  === SubClass)).

append(   ';(subClass instanceof SubClass) = '   ).append((subClass   instanceof   SubClass)).

append(   ';(subClass instanceof BaseClass) = '   ).append((subClass   instanceof   BaseClass)).toString();

执行结果:

subClass.toString() = id = 1, name =subClass, identifer = 0001
subClass.constructor = function BaseClass(){}
(subClass.constructor  === SubClass) =false
(subClass instanceof SubClass) = true
(subClass instanceof BaseClass) = true

9、基于 构造函数(封装类属性-成员变量) + 原型 (封装类行为-方法)实现JavaScript对象继承。(不支持多重继承,支持instanceof关键字,多层继承时模版复用)

代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

// Define baseclass.

function   BaseClass(id, name){

       this   .id = id;

       this   .name = name;

}

// Overwrite toString method.

BaseClass.prototype.toString =   function   (){

       return   'id = '   +   this   .id +   ', name ='   +   this   .name;

};

     

 

// Define subclass.

function   SubClass(){

       BaseClass.apply(   this   , arguments);

       this   .identifer = arguments[arguments.length - 1];

}

// Subclass extends base class.

SubClass.prototype =   new   BaseClass();

SubClass.prototype.constructor = SubClass;

SubClass.prototype.toString =   function   (){

       return   BaseClass.prototype.toString.call(   this   ) +   ', identifer = '   +   this   .identifer;

};

         

// The subclass is intanced.

var   subClass =   new   SubClass(1,   'subClass'   ,   '0001'   );

 

// Output

new   StringBuffer(   'subClass.toString() = '   ).append(subClass.toString()).

append(   ';subClass.constructor = '   ).append(subClass.constructor).

append(   ';(subClass.constructor  === SubClass) ='   ).append((subClass.constructor  === SubClass)).

append(   ';(subClass instanceof SubClass) = '   ).append((subClass   instanceof   SubClass)).

append(   ';(subClass instanceof BaseClass) = '   ).append((subClass   instanceof   BaseClass)).toString();

执行结果:

subClass.toString() = id = 1, name =subClass, identifer = 0001
subClass.constructor = function SubClass(){BaseClass.apply(this, arguments)this.identifer = arguments[arguments.length - 1]}
(subClass.constructor  === SubClass) =true
(subClass instanceof SubClass) = true
(subClass instanceof BaseClass) = true

10、基于 对象结构(哈希表key-value)实现JavaScript对象继承。(支持多重继承,不支持instanceof关键字,多层继承时模版迭代)

代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

// Define class factory.

var   ClassFactory = {

       createClass :   function   (){

           // To defind the current constructor.

           var   CurrentClass =   function   (){};

           // Agreed the final parameter for the current class extends the prototype, for the rest of the parameters so as to realize the parent class.

           var   extendsPrototype = arguments[arguments.length - 1] || {};

           for   (   var   i   in   arguments){

               if   (i == arguments.length - 1)   break   ;

               var   superClass = arguments[i];

               var   ordinal = superClass.ORDINAL = i;

               if   (   'function'   ===   typeof   (superClass)){

                   superClass = superClass.prototype;

               }

               var   superPrototype = extendsPrototype[ordinal] = {};

               for   (   var   key   in   superClass) {

                   // Determine whether the current members of the current class

                   if   (superClass.hasOwnProperty(key)){

                       superPrototype[key] = superClass[key];

                   }   else   {

                       extendsPrototype[key] = superClass[key];

                   }

               }

           }

         

           // Prototype will expand after the prototype chain of pointing to the current class.

           CurrentClass.prototype = extendsPrototype;

           CurrentClass.prototype.constructor = CurrentClass;

           return   CurrentClass;

       }

};

// Define class A

var   A = ClassFactory.createClass({

       width : 100,

       getWidth :   function   (){

           return   this   .width;

       }

});

 

// Define class B

var   B = ClassFactory.createClass({

       width : 200,

       height : 100,

       getWidth :   function   (){

           return   this   .width;

       },

       getHeight :   function   (){

           return   this   .height;

       }

});

 

// Define class C

var   C = ClassFactory.createClass(A, B,{

       width : 300,

       getWidth :   function   (){

           return   this   .width;

       }

});

 

// Initialize C object

var   c =   new   C();

 

// Output

new   StringBuffer(   'c.constructor = '   ).append(c.constructor).

append(   ';(c.constructor === C) = '   ).append((c.constructor === C)).

append(   ';(c instanceof C) = '   ).append((c   instanceof   C)).

append(   ';((c instanceof A) || (c instanceof B)) = '   ).append(((c   instanceof   A) || (c   instanceof   B))).

append(   ';c.getWidth() = '   ).append(c.getWidth()).

append(   ';c[A.ORDINAL].getWidth() = '   ).append(   (c[A.ORDINAL]).getWidth()   ).

append(   ';c[B.ORDINAL].getWidth() = '   ).append(   (c[B.ORDINAL]).getWidth()   ).

append(   ';c[B.ORDINAL].getHeight() = '   ).append(   (c[B.ORDINAL]).getHeight()   ).toString();

执行结果:

c.constructor = function (){}
(c.constructor === C) = true
(c instanceof C) = true
((c instanceof A) || (c instanceof B)) = false
c.getWidth() = 300
c[A.ORDINAL].getWidth() = 100
c[B.ORDINAL].getWidth() = 200
c[B.ORDINAL].getHeight() = 100

11、基于 构造函数(封装类属性-成员变量) + 原型 (封装类行为-方法)实现JavaScript对象继承推荐写法。(不支持多重继承,支持instanceof关键字,多层继承时模版复用)

代码片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

// Define class factory.

var   ClassFactory = {

       createClass :   function   (){

           // To defind the current constructor.

           // TODO set member Variables

           var   CurrentClass =   function   (){

               if   (   this   .initialize){

                   this   .initialize.apply(   this   , arguments);

               }

           };

           // The current class to extends base class.

           var   SuperClass = arguments[0] ||   ''   ;

           if   (   typeof   (SuperClass) ===   'function'   ){

               CurrentClass.prototype =   new   SuperClass();

           }   else   {

               // If current class is base class, then current class prototype direct at Object prototype.

               CurrentClass.prototype =   new   Object();

           }

           CurrentClass.prototype.constructor = CurrentClass;

         

           // The current class to extend prototype.

           var   extendsPrototype = arguments[arguments.length - 1] || {};

           for   (   var   key   in   extendsPrototype){

               CurrentClass.prototype[key] = extendsPrototype[key];

           }

         

           return   CurrentClass;

       }

}

// Define base class.

var   SuperComponent = ClassFactory.createClass({

       initialize :   function   (title, index){

           this   .rootNodeName =   'js_oo'   ;

           this   .className =   'demo_container'   ;

           this   .title = title;

           this   .index = index;

       },

       getScript :   function   (){

           throw   new   Error(   'The method must be implemented sub class!'   );

       }

});

// Define sub class.

var   TestComponent = ClassFactory.createClass(SuperComponent, {

       getScript :   function   (){

           var   _script =   new   StringBuffer();

           _script.append(   this   .title);

           return   _script.toString();

       }

});

     

var   testComponent =   new   TestComponent(   "TestComponent"   , 2);

 

// Output

new   StringBuffer(   'testComponent.constructor = '   ).append(testComponent.constructor).

append(   ';(testComponent.constructor === TestComponent) = '   ).append((testComponent.constructor === TestComponent)).

append(   ';(testComponent instanceof  TestComponent) = '   ).append((testComponent   instanceof     TestComponent)).

append(   ';(testComponent instanceof  SuperComponent) = '   ).append((testComponent   instanceof     SuperComponent)).

append(   ';testComponent.getScript() = '   ).append(testComponent.getScript()).toString();

执行结果:

testComponent.constructor = function (){if(this.initialize){this.initialize.apply(this, arguments)}}
(testComponent.constructor === TestComponent) = true
(testComponent instanceof  TestComponent) = true
(testComponent instanceof  SuperComponent) = true
testComponent.getScript() = TestComponent


转载于:https://my.oschina.net/andy0807/blog/190677

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idae 安装的插件怎么删掉_X7 IE阻止我安装插件怎么办

为了在网页上表现多彩的多媒体内容,很多网站会要求我们装上相应的网页插件来实现。但IE的默认安全设置会阻止我们进行安装某些网页插件。可是如果不装的话,网页很多媒体的内容就会显示不出来。怎么办呢?其实我们可以调整IE的安全设定来解决。…

MongoDB基本管理命令

2019独角兽企业重金招聘Python工程师标准>>> MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表;而每个集合中可以存储一组由列标识的记录&#xff0c…

花季少女竟然有个三年级老公??!

1 不能直视咖啡了(素材来源网络,侵删)▼2 不理外国人的后果(素材来源网络,侵删)▼3 猫占鸡巢(素材来源网络,侵删)▼4 律师有什么坏心思呢?(素材…

dotnet-httpie 0.2.0 Released

dotnet-httpie 0.2.0 ReleasedIntrodotnet-httpie 是类 httpie 的一个调用 HTTP API 的小工具,可以帮助我们快速测试 API,语法和 httpie 基本一样。第一个版本发布之后,做了一些重构,使用 System.CommandLine 重写了对于 Option 的…

黑色边影,

多次 设置frame,并用了动画, [UIViewbeginAnimations:nilcontext:nil]; [UIViewsetAnimationDelegate:self]; [UIViewsetAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; [UIViewsetAnimationDuration:[[…

分子模拟软件amber_容天AMBER优化的GPU解决方案

AMBER认证的GPU系统AMBER认证GPU系统提供商容天更快地运行MD仿真容天与AMBER的主要开发商合作开发了交钥匙解决方案,为GPU加速的生物分子模拟提供增值系统。经过验证的系统,每个用户的CPU,GPU,内存和存储具有适当的平衡。从工作站…

linux c之孤儿进程与僵尸进程[总结]

转载地址:http://www.cnblogs.com/Anker/p/3271773.html 1、前言 之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题&#xf…

留学申请中,你们怎么老让我做科研啊?

全世界只有3.14 % 的人关注了爆炸吧知识太太太太闹心了,真的,留学申请准备这准备那已经很糟心了,怎么总看到让我做科研的广告啊,刚开始看看没在意,越来越多越来越多,不做都感觉赶不上潮流,不做就…

C# Dispose模式

目的为了及时释放宝贵的非托管资源和托管资源,并且保证资源在被 gc 回收的时候可以正确释放资源,同时兼顾执行效率。必须遵循的事实1 . 托管资源释放:  由另一线程的 gc 进行释放,当托管的对象没有被引用时,就会在“…

在ASP.NET项目中使用CKEditor +CKFinder实现图片上传功能

前言 之前的项目中一直使用的是FCKeditor,昨天突然有个想法:为什么不试一下新的CKEditor呢?于是花了大半天的时间去学习它的用法,现在把我的学习过程与大家分享一下。 谈起FCKeditor,相信没几个Web程序员不知道的吧。不…

linux之内核剖析

Linux 内核简介 现在让我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构。您可以从两个层次上来考虑操作系统,如图 2 所示。 图 2. GNU/Linux 操作系统的基本体系结构 上面是用户(或应用程序)空间。这是用户应用程序执行的地…

linux笔记 3-4 SMTP,.配置电子邮件传输

***************4.配置电子邮件传输*****************##1.基本电子邮件配置##配置dns服务,添加MX记录两台服务器分别配置 /etc/postfix/main.cf文件myhostname--主机名mydomain--域名myorigin--重写本地发布的电子邮件,使其显示为来自该域。这样有助于确保响应返回入…

希尔排序算法的实现

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于…

linux c之信号signal处理机制

最近同事的程序设计过程中用到了Linux的signal机制,从而引发了我对Linux中signal机制的思考。Signal机制在Linux中是一个非常常用的进程间通信机制,很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断,因…

技术分享 | 微服务模式下如何高效进行API测试

导读:微服务架构下,API 测试的最大挑战来自于庞大的测试用例数量,以及微服务之间的相互耦合。基于这种挑战,如何进行高效的API测试,选择什么样的方式就比较重要,此文主要是采用契约测试的方法来对微服务模式…

由CloudStack项目引起的ESXI嵌套虚拟化引起的二级虚拟机无法被访问

关于这个问题,主要以文字描述为主,最终解决方法其实就一个步骤。问题描述:某客户需要部署某企业的云平台,但是由于年前没有足够的物理机资源,所以提供的资源均为虚拟机,现在让我们做技术评估。其实观察整个…

美女的床真的好难爬......

1 地中海式茂密?▼2 阴着呐▼3 拜拜了您呐▼4 草莓从哪里来▼5 爷青结系列▼6 没点才艺还住不了酒店了▼7 美女的床果真很难爬(真从500平大床中醒来)▼8 数学能有多有趣▼你点的每个赞,我都认真当成了喜欢

控制器方法错误处理

错误处理一直是开发维护阶段需要重点关注的一块,控制器中方法原则上都需要处理错误。 1、添加BaseController 路径:nweb\src\main\java\com\nankang\cati\nweb\controller\BaseController.java 所有的控制器都继承BaseController 2、使用: 1&…