JS面向对象及组件开发

面向对象的组成

[html] view
plain
 copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <script>
  7. var arr = [];
  8. arr.number = 10;  //对象下面的变量:叫做对象的属性
  9. //alert( arr.number );
  10. //alert( arr.length );
  11. arr.test = function(){  //对象下面的函数 : 叫做对象的方法
  12. alert(123);
  13. };
  14. arr.test();
  15. arr.push();
  16. arr.sort();
  17. </script>
  18. </head>
  19. <body>
  20. </body>
  21. </html>

创建第一个面向对象程序

[html] view
plain
 copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <script>
  7. //var obj = {};
  8. var obj = new Object();  //创建了一个空的对象
  9. obj.name = ‘小明‘;  //属性
  10. obj.showName = function(){  //方法
  11. alert(this.name);
  12. };
  13. obj.showName();
  14. var obj2 = new Object();  //创建了一个空的对象
  15. obj2.name = ‘小强‘;  //属性
  16. obj2.showName = function(){  //方法
  17. alert(this.name);
  18. };
  19. obj2.showName();
  20. </script>
  21. </head>
  22. <body>
  23. </body>
  24. </html>

工厂方式

[html] view
plain
 copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <script>
  7. //工厂方式 : 封装函数
  8. function createPerson(name){
  9. //1.原料
  10. var obj = new Object();
  11. //2.加工
  12. obj.name = name;
  13. obj.showName = function(){
  14. alert( this.name );
  15. };
  16. //3.出场
  17. return obj;
  18. }
  19. var p1 = createPerson(‘小明‘);
  20. p1.showName();
  21. var p2 = createPerson(‘小强‘);
  22. p2.showName();
  23. </script>
  24. </head>
  25. <body>
  26. </body>
  27. </html>

[html] view
plain
 copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <script>
  7. //当new去调用一个函数 : 这个时候函数中的this就是创建出来的对象,而且函数的的返回值直接就是this啦(隐式返回)
  8. //new后面调用的函数 : 叫做构造函数
  9. function CreatePerson(name){
  10. this.name = name;
  11. this.showName = function(){
  12. alert( this.name );
  13. };
  14. }
  15. var p1 = new CreatePerson(‘小明‘);
  16. //p1.showName();
  17. var p2 = new CreatePerson(‘小强‘);
  18. //p2.showName();
  19. alert( p1.showName == p2.showName );  //false
  20. var arr = new Array();
  21. var date = new Date();
  22. </script>
  23. </head>
  24. <body>
  25. </body>
  26. </html>

对象的引用

[html] view
plain
 copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <script>
  7. /*var a = [1,2,3];
  8. var b = [1,2,3];
  9. alert( a == b );  //false*/
  10. //var a = 5;
  11. //var b = a;
  12. //b += 3;
  13. ////alert(b); //8
  14. //alert(a); //5   基本类型 : 赋值的时候只是值的复制
  15. //var a = [1,2,3];
  16. //var b = a;
  17. //b.push(4);
  18. ////alert(b);  //[1,2,3,4]
  19. //alert(a);  //[1,2,3,4]   对象类型 : 赋值不仅是值的复制,而且也是引用的传递
  20. //var a = [1,2,3];
  21. //var b = a;
  22. //b = [1,2,3,4];
  23. ////alert(b); //[1,2,3,4]
  24. //alert(a); //[1,2,3]
  25. //var a = 5;
  26. //var b = 5;
  27. //
  28. //alert(a == b);  //基本类型 : 值相同就可以
  29. //var a = [1,2,3];
  30. //var b = [1,2,3];
  31. //alert( a == b );  //false  //对象类型 : 值和引用都相同才行
  32. var a = [1,2,3];
  33. var b = a;
  34. alert( a==b );  //true
  35. </script>
  36. </head>
  37. <body>
  38. </body>
  39. </html>

原型

[html] view
plain
 copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <script>
  7. //原型 : 去改写对象下面公用的方法或者属性 , 让公用的方法或者属性在内存中存在一份 ( 提高性能 )
  8. //原型 : CSS中的class
  9. //普通方法 : CSS中的style
  10. //原型 : prototype : 要写在构造函数的下面
  11. /*var arr = [1,2,3,4,5];
  12. var arr2 = [2,2,2,2,2];
  13. arr.sum = function(){
  14. var result = 0;
  15. for(var i=0;i<this.length;i++){
  16. result += this[i];
  17. }
  18. return result;
  19. };
  20. arr2.sum = function(){
  21. var result = 0;
  22. for(var i=0;i<this.length;i++){
  23. result += this[i];
  24. }
  25. return result;
  26. };
  27. //alert( arr.sum() );  //15
  28. //alert( arr2.sum() );  //10*/
  29. var arr = [1,2,3,4,5];
  30. var arr2 = [2,2,2,2,2];
  31. Array.prototype.sum = function(){
  32. var result = 0;
  33. for(var i=0;i<this.length;i++){
  34. result += this[i];
  35. }
  36. return result;
  37. };
  38. alert( arr.sum() );  //15
  39. alert( arr2.sum() );  //10
  40. </script>
  41. </head>
  42. <body>
  43. </body>
  44. </html>

[html] view
plain
 copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <script>
  7. var arr = [];
  8. //arr.number = 10;
  9. Array.prototype.number = 20;
  10. alert(arr.number);
  11. </script>
  12. </head>
  13. <body>
  14. </body>
  15. </html>

工厂方法之原型

[html] view
plain
 copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <script>
  7. //当new去调用一个函数 : 这个时候函数中的this就是创建出来的对象,而且函数的的返回值直接就是this啦(隐式返回)
  8. //new后面调用的函数 : 叫做构造函数
  9. function CreatePerson(name){
  10. this.name = name;
  11. }
  12. CreatePerson.prototype.showName = function(){
  13. alert( this.name );
  14. };
  15. var p1 = new CreatePerson(‘小明‘);
  16. //p1.showName();
  17. var p2 = new CreatePerson(‘小强‘);
  18. //p2.showName();
  19. alert( p1.showName == p2.showName );  //true
  20. var arr = new Array();
  21. var date = new Date();
  22. </script>
  23. </head>
  24. <body>
  25. </body>
  26. </html>

面向对象的写法

[html] view
plain
 copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <script>
  7. function 构造函数(){
  8. this.属性
  9. }
  10. 构造函数.原型.方法 = function(){};
  11. var 对象1 = new 构造函数();
  12. 对象1.方法();
  13. </script>
  14. </head>
  15. <body>
  16. </body>
  17. </html>

面向对象的选项卡

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <style>
  7. #div1 div{ width:200px; height:200px; border:1px #000 solid; display:none;}
  8. .active{ background:red;}
  9. </style>
  10. <script>
  11. /*window.onload = function(){
  12. var oParent = document.getElementById(‘div1‘);
  13. var aInput = oParent.getElementsByTagName(‘input‘);
  14. var aDiv = oParent.getElementsByTagName(‘div‘);
  15. for(var i=0;i<aInput.length;i++){
  16. aInput[i].index = i;
  17. aInput[i].onclick = function(){
  18. for(var i=0;i<aInput.length;i++){
  19. aInput[i].className = ‘‘;
  20. aDiv[i].style.display = ‘none‘;
  21. }
  22. this.className = ‘active‘;
  23. aDiv[this.index].style.display = ‘block‘;
  24. };
  25. }
  26. };*/
  27. //先变型:
  28. //尽量不要出现函数嵌套函数
  29. //可以有全局变量
  30. //把onload中不是赋值的语句放到单独函数中
  31. var oParent = null;
  32. var aInput = null;
  33. var aDiv = null;
  34. window.onload = function(){
  35. oParent = document.getElementById(‘div1‘);
  36. aInput = oParent.getElementsByTagName(‘input‘);
  37. aDiv = oParent.getElementsByTagName(‘div‘);
  38. init();
  39. };
  40. function init(){
  41. for(var i=0;i<aInput.length;i++){
  42. aInput[i].index = i;
  43. aInput[i].onclick = change;
  44. }
  45. }
  46. function change(){
  47. for(var i=0;i<aInput.length;i++){
  48. aInput[i].className = ‘‘;
  49. aDiv[i].style.display = ‘none‘;
  50. }
  51. this.className = ‘active‘;
  52. aDiv[this.index].style.display = ‘block‘;
  53. }
  54. </script>
  55. </head>
  56. <body>
  57. <div id="div1">
  58. <input class="active" type="button" value="1">
  59. <input type="button" value="2">
  60. <input type="button" value="3">
  61. <div style="display:block">11111</div>
  62. <div>22222</div>
  63. <div>33333</div>
  64. </div>
  65. </body>
  66. </html>

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <style>
  7. #div1 div{ width:200px; height:200px; border:1px #000 solid; display:none;}
  8. .active{ background:red;}
  9. </style>
  10. <script>
  11. /*window.onload = function(){
  12. var oParent = document.getElementById(‘div1‘);
  13. var aInput = oParent.getElementsByTagName(‘input‘);
  14. var aDiv = oParent.getElementsByTagName(‘div‘);
  15. for(var i=0;i<aInput.length;i++){
  16. aInput[i].index = i;
  17. aInput[i].onclick = function(){
  18. for(var i=0;i<aInput.length;i++){
  19. aInput[i].className = ‘‘;
  20. aDiv[i].style.display = ‘none‘;
  21. }
  22. this.className = ‘active‘;
  23. aDiv[this.index].style.display = ‘block‘;
  24. };
  25. }
  26. };*/
  27. //先变型:
  28. //尽量不要出现函数嵌套函数
  29. //可以有全局变量
  30. //把onload中不是赋值的语句放到单独函数中
  31. /*var oParent = null;
  32. var aInput = null;
  33. var aDiv = null;
  34. window.onload = function(){
  35. oParent = document.getElementById(‘div1‘);
  36. aInput = oParent.getElementsByTagName(‘input‘);
  37. aDiv = oParent.getElementsByTagName(‘div‘);
  38. init();
  39. };
  40. function init(){
  41. for(var i=0;i<aInput.length;i++){
  42. aInput[i].index = i;
  43. aInput[i].onclick = change;
  44. }
  45. }
  46. function change(){
  47. for(var i=0;i<aInput.length;i++){
  48. aInput[i].className = ‘‘;
  49. aDiv[i].style.display = ‘none‘;
  50. }
  51. this.className = ‘active‘;
  52. aDiv[this.index].style.display = ‘block‘;
  53. }*/
  54. //改成面向对象:
  55. //全局变量就是属性
  56. //函数就是方法
  57. //Onload中创建对象
  58. //改this指向问题 : 事件或者是定时器,尽量让面向对象中的this指向对象
  59. window.onload = function(){
  60. var t1 = new Tab();
  61. t1.init();
  62. };
  63. function Tab(){
  64. this.oParent = document.getElementById(‘div1‘);
  65. this.aInput = this.oParent.getElementsByTagName(‘input‘);
  66. this.aDiv = this.oParent.getElementsByTagName(‘div‘);
  67. }
  68. Tab.prototype.init = function(){
  69. var This = this;
  70. for(var i=0;i<this.aInput.length;i++){
  71. this.aInput[i].index = i;
  72. this.aInput[i].onclick = function(){
  73. This.change(this);
  74. };
  75. }
  76. };
  77. Tab.prototype.change = function(obj){
  78. for(var i=0;i<this.aInput.length;i++){
  79. this.aInput[i].className = ‘‘;
  80. this.aDiv[i].style.display = ‘none‘;
  81. }
  82. obj.className = ‘active‘;
  83. this.aDiv[obj.index].style.display = ‘block‘;
  84. };
  85. </script>
  86. </head>
  87. <body>
  88. <div id="div1">
  89. <input class="active" type="button" value="1">
  90. <input type="button" value="2">
  91. <input type="button" value="3">
  92. <div style="display:block">11111</div>
  93. <div>22222</div>
  94. <div>33333</div>
  95. </div>
  96. </body>
  97. </html>

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <style>
  7. #div1 div,#div2 div{ width:200px; height:200px; border:1px #000 solid; display:none;}
  8. .active{ background:red;}
  9. </style>
  10. <script>
  11. /*var arr = [4,7,1,3];
  12. arr.sort();  // 1 3 4 7
  13. var arr2 = [4,7,1,3];
  14. arr2.push(5);
  15. arr2.sort(); // 1 3 4 5 7
  16. */
  17. window.onload = function(){
  18. var t1 = new Tab(‘div1‘);
  19. t1.init();
  20. t1.autoPlay();
  21. var t2 = new Tab(‘div2‘);
  22. t2.init();
  23. t2.autoPlay();
  24. };
  25. function Tab(id){
  26. this.oParent = document.getElementById(id);
  27. this.aInput = this.oParent.getElementsByTagName(‘input‘);
  28. this.aDiv = this.oParent.getElementsByTagName(‘div‘);
  29. this.iNow = 0;
  30. }
  31. Tab.prototype.init = function(){
  32. var This = this;
  33. for(var i=0;i<this.aInput.length;i++){
  34. this.aInput[i].index = i;
  35. this.aInput[i].onclick = function(){
  36. This.change(this);
  37. };
  38. }
  39. };
  40. Tab.prototype.change = function(obj){
  41. for(var i=0;i<this.aInput.length;i++){
  42. this.aInput[i].className = ‘‘;
  43. this.aDiv[i].style.display = ‘none‘;
  44. }
  45. obj.className = ‘active‘;
  46. this.aDiv[obj.index].style.display = ‘block‘;
  47. };
  48. Tab.prototype.autoPlay = function(){
  49. var This = this;
  50. setInterval(function(){
  51. if(This.iNow == This.aInput.length-1){
  52. This.iNow = 0;
  53. }
  54. else{
  55. This.iNow++;
  56. }
  57. for(var i=0;i<This.aInput.length;i++){
  58. This.aInput[i].className = ‘‘;
  59. This.aDiv[i].style.display = ‘none‘;
  60. }
  61. This.aInput[This.iNow].className = ‘active‘;
  62. This.aDiv[This.iNow].style.display = ‘block‘;
  63. },2000);
  64. };
  65. </script>
  66. </head>
  67. <body>
  68. <div id="div1">
  69. <input class="active" type="button" value="1">
  70. <input type="button" value="2">
  71. <input type="button" value="3">
  72. <div style="display:block">11111</div>
  73. <div>22222</div>
  74. <div>33333</div>
  75. </div>
  76. <div id="div2">
  77. <input class="active" type="button" value="1">
  78. <input type="button" value="2">
  79. <input type="button" value="3">
  80. <div style="display:block">11111</div>
  81. <div>22222</div>
  82. <div>33333</div>
  83. </div>
  84. </body>
  85. </html>

面向对象的拖拽

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <style>
  7. #div1 div,#div2 div{ width:200px; height:200px; border:1px #000 solid; display:none;}
  8. .active{ background:red;}
  9. </style>
  10. <script>
  11. /*var arr = [4,7,1,3];
  12. arr.sort();  // 1 3 4 7
  13. var arr2 = [4,7,1,3];
  14. arr2.push(5);
  15. arr2.sort(); // 1 3 4 5 7
  16. */
  17. window.onload = function(){
  18. var t1 = new Tab(‘div1‘);
  19. t1.init();
  20. t1.autoPlay();
  21. var t2 = new Tab(‘div2‘);
  22. t2.init();
  23. t2.autoPlay();
  24. };
  25. function Tab(id){
  26. this.oParent = document.getElementById(id);
  27. this.aInput = this.oParent.getElementsByTagName(‘input‘);
  28. this.aDiv = this.oParent.getElementsByTagName(‘div‘);
  29. this.iNow = 0;
  30. }
  31. Tab.prototype.init = function(){
  32. var This = this;
  33. for(var i=0;i<this.aInput.length;i++){
  34. this.aInput[i].index = i;
  35. this.aInput[i].onclick = function(){
  36. This.change(this);
  37. };
  38. }
  39. };
  40. Tab.prototype.change = function(obj){
  41. for(var i=0;i<this.aInput.length;i++){
  42. this.aInput[i].className = ‘‘;
  43. this.aDiv[i].style.display = ‘none‘;
  44. }
  45. obj.className = ‘active‘;
  46. this.aDiv[obj.index].style.display = ‘block‘;
  47. };
  48. Tab.prototype.autoPlay = function(){
  49. var This = this;
  50. setInterval(function(){
  51. if(This.iNow == This.aInput.length-1){
  52. This.iNow = 0;
  53. }
  54. else{
  55. This.iNow++;
  56. }
  57. for(var i=0;i<This.aInput.length;i++){
  58. This.aInput[i].className = ‘‘;
  59. This.aDiv[i].style.display = ‘none‘;
  60. }
  61. This.aInput[This.iNow].className = ‘active‘;
  62. This.aDiv[This.iNow].style.display = ‘block‘;
  63. },2000);
  64. };
  65. </script>
  66. </head>
  67. <body>
  68. <div id="div1">
  69. <input class="active" type="button" value="1">
  70. <input type="button" value="2">
  71. <input type="button" value="3">
  72. <div style="display:block">11111</div>
  73. <div>22222</div>
  74. <div>33333</div>
  75. </div>
  76. <div id="div2">
  77. <input class="active" type="button" value="1">
  78. <input type="button" value="2">
  79. <input type="button" value="3">
  80. <div style="display:block">11111</div>
  81. <div>22222</div>
  82. <div>33333</div>
  83. </div>
  84. </body>
  85. </html>

包装对象

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. /*function Aaa(){
  8. this.name = ‘小明‘;
  9. }
  10. Aaa.prototype.showName = function(){
  11. alert( this.name );
  12. };
  13. var a1 = new Aaa();
  14. a1.showName();
  15. var arr = new Array();
  16. arr.push();
  17. arr.sort();
  18. //在JS源码 : 系统对象也是基于原型的程序
  19. function Array(){
  20. this.lenglth = 0;
  21. }
  22. Array.prototype.push = function(){};
  23. Array.prototype.sort = function(){};*/
  24. //尽量不要去修改或者添加系统对象下面的方法和属性
  25. var arr = [1,2,3];
  26. Array.prototype.push = function(){
  27. //this : 1,2,3
  28. //arguments : 4,5,6
  29. for(var i=0;i<arguments.length;i++){
  30. this[this.length] = arguments[i]
  31. }
  32. return this.length;
  33. };
  34. arr.push(4,5,6);
  35. alert( arr );
  36. //pop shift unshift splice sort
  37. </script>
  38. </head>
  39. <body>
  40. </body>
  41. </html>

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. /*var str = ‘hello‘;
  8. alert( typeof str );
  9. str.charAt(0);
  10. str.indexOf(‘e‘);*/
  11. //null undefined
  12. //包装对象 : 基本类型都有自己对应的包装对象 : String  Number  Boolean
  13. /*var str = new String(‘hello‘);
  14. //alert( typeof str );
  15. alert(str.charAt(1));
  16. String.prototype.charAt = function(){};*/
  17. //var str = ‘hello‘;
  18. //str.charAt(0);  //基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法给了基本类型,然后包装对象消失
  19. /*var str = ‘hello‘;
  20. String.prototype.lastValue = function(){
  21. return this.charAt(this.length-1);
  22. };
  23. alert( str.lastValue() );  //o*/
  24. var str = ‘hello‘;
  25. str.number = 10;
  26. alert( str.number );  //undefined
  27. </script>
  28. </head>
  29. <body>
  30. </body>
  31. </html>

原型链

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. //原型链 : 实例对象与原型之间的连接,叫做原型链
  8. //原型链的最外层 : Object.prototype
  9. function Aaa(){
  10. //this.num = 20;
  11. }
  12. //Aaa.prototype.num = 10;
  13. Object.prototype.num = 30;
  14. var a1 = new Aaa();
  15. alert(a1.num);
  16. </script>
  17. </head>
  18. <body>
  19. </body>
  20. </html>

hasOwnProperty

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. //hasOwnProperty : 看是不是对象自身下面的属性
  8. var arr = [];
  9. arr.num = 10;
  10. Array.prototype.num2 = 20;
  11. //alert(  arr.hasOwnProperty(‘num‘)  );  //true
  12. alert(  arr.hasOwnProperty(‘num2‘)  );  //false
  13. </script>
  14. </head>
  15. <body>
  16. </body>
  17. </html>

constructor

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. //constructor : 查看对象的构造函数
  8. /*function Aaa(){
  9. }
  10. var a1 = new Aaa();
  11. alert( a1.constructor );  //Aaa
  12. var arr = [];
  13. alert( arr.constructor == Array );  //true*/
  14. /*function Aaa(){
  15. }
  16. //Aaa.prototype.constructor = Aaa;   //每一个函数都会有的,都是自动生成的
  17. //Aaa.prototype.constructor = Array;
  18. var a1 = new Aaa();
  19. alert( a1.hasOwnProperty == Object.prototype.hasOwnProperty );  //true*/
  20. /*function Aaa(){
  21. }
  22. Aaa.prototype.name = ‘小明‘;
  23. Aaa.prototype.age = 20;
  24. Aaa.prototype = {
  25. constructor : Aaa,
  26. name : ‘小明‘,
  27. age : 20
  28. };
  29. var a1 = new Aaa();
  30. alert( a1.constructor );*/
  31. function Aaa(){
  32. }
  33. Aaa.prototype.name = 10;
  34. Aaa.prototype.constructor = Aaa;
  35. for( var attr in Aaa.prototype ){
  36. alert(attr);
  37. }
  38. </script>
  39. </head>
  40. <body>
  41. </body>
  42. </html>

instanceof

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. //instanceof : 对象与构造函数在原型链上是否有关系
  8. function Aaa(){
  9. }
  10. var a1 = new Aaa();
  11. //alert( a1 instanceof Object );  //true
  12. var arr = [];
  13. alert( arr instanceof Array );
  14. </script>
  15. </head>
  16. <body>
  17. </body>
  18. </html>

toString

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. //toString() : 系统对象下面都是自带的 , 自己写的对象都是通过原型链找object下面的
  8. /*var arr = [];
  9. alert( arr.toString == Object.prototype.toString ); //false*/
  10. /*function Aaa(){
  11. }
  12. var a1 = new Aaa();
  13. alert( a1.toString == Object.prototype.toString );  //true*/
  14. //toString() : 把对象转成字符串
  15. /*var arr = [1,2,3];
  16. Array.prototype.toString = function(){
  17. return this.join(‘+‘);
  18. };
  19. alert( arr.toString() );  //‘1,2,3‘*/
  20. //var num = 255;
  21. //alert( num.toString(16) );  //‘ff‘
  22. //利用toString做类型的判断 :
  23. /*var arr = [];
  24. alert( Object.prototype.toString.call(arr) == ‘[object Array]‘ ); */ //‘[object Array]‘
  25. window.onload = function(){
  26. var oF = document.createElement(‘iframe‘);
  27. document.body.appendChild( oF );
  28. var ifArray = window.frames[0].Array;
  29. var arr = new ifArray();
  30. //alert( arr.constructor == Array );  //false
  31. //alert( arr instanceof Array );  //false
  32. alert( Object.prototype.toString.call(arr) == ‘[object Array]‘ );  //true
  33. };
  34. </script>
  35. </head>
  36. <body>
  37. </body>
  38. </html>

继承

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. //继承 : 子类不影响父类,子类可以继承父类的一些功能 ( 代码复用 )
  8. //属性的继承 : 调用父类的构造函数 call
  9. //方法的继承 : for in :  拷贝继承 (<a href="http://lib.csdn.net/base/22" class="replace_word" title="jQuery知识库" target="_blank" style="color:#df3434; font-weight:bold;">jquery</a>也是采用拷贝继承extend)
  10. function CreatePerson(name,sex){   //父类
  11. this.name = name;
  12. this.sex = sex;
  13. }
  14. CreatePerson.prototype.showName = function(){
  15. alert( this.name );
  16. };
  17. var p1 = new CreatePerson(‘小明‘,‘男‘);
  18. //p1.showName();
  19. function CreateStar(name,sex,job){  //子类
  20. CreatePerson.call(this,name,sex);
  21. this.job = job;
  22. }
  23. //CreateStar.prototype = CreatePerson.prototype;
  24. extend( CreateStar.prototype , CreatePerson.prototype );
  25. CreateStar.prototype.showJob = function(){
  26. };
  27. var p2 = new CreateStar(‘黄晓明‘,‘男‘,‘演员‘);
  28. p2.showName();
  29. function extend(obj1,obj2){
  30. for(var attr in obj2){
  31. obj1[attr] = obj2[attr];
  32. }
  33. }
  34. </script>
  35. </head>
  36. <body>
  37. </body>
  38. </html>

对象的复制

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. /*var a = {
  8. name : ‘小明‘
  9. };
  10. var b = a;
  11. b.name = ‘小强‘;
  12. alert( a.name );*/
  13. /*var a = {
  14. name : ‘小明‘
  15. };
  16. //var b = a;
  17. var b = {};
  18. extend( b , a );
  19. b.name = ‘小强‘;
  20. alert( a.name );
  21. function extend(obj1,obj2){
  22. for(var attr in obj2){
  23. obj1[attr] = obj2[attr];
  24. }
  25. }*/
  26. var a = [1,2,3];
  27. var b = a;
  28. //b.push(4);
  29. b = [1,2,3,4];
  30. alert(a);
  31. </script>
  32. </head>
  33. <body>
  34. </body>
  35. </html>

继承的拖拽

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <style>
  7. #div1{ width:100px; height:100px; background:red; position:absolute;}
  8. #div2{ width:100px; height:100px; background:yellow; position:absolute; left:100px;}
  9. </style>
  10. <script>
  11. window.onload = function(){
  12. var d1 = new Drag(‘div1‘);
  13. d1.init();
  14. var d2 = new ChildDrag(‘div2‘);
  15. d2.init();
  16. };
  17. function Drag(id){  //父类
  18. this.obj = document.getElementById(id);
  19. this.disX = 0;
  20. this.disY = 0;
  21. }
  22. Drag.prototype.init = function(){
  23. var This = this;
  24. this.obj.onmousedown = function(ev){
  25. var ev = ev || window.event;
  26. This.fnDown(ev);
  27. document.onmousemove = function(ev){
  28. var ev = ev || window.event;
  29. This.fnMove(ev);
  30. };
  31. document.onmouseup = function(){
  32. This.fnUp();
  33. };
  34. return false;
  35. };
  36. };
  37. Drag.prototype.fnDown = function(ev){
  38. this.disX = ev.clientX - this.obj.offsetLeft;
  39. this.disY = ev.clientY - this.obj.offsetTop;
  40. };
  41. Drag.prototype.fnMove = function(ev){
  42. this.obj.style.left = ev.clientX - this.disX + ‘px‘;
  43. this.obj.style.top = ev.clientY - this.disY + ‘px‘;
  44. };
  45. Drag.prototype.fnUp = function(){
  46. document.onmousemove = null;
  47. document.onmouseup = null;
  48. };
  49. function ChildDrag(id){   //子类
  50. Drag.call(this,id);
  51. }
  52. extend( ChildDrag.prototype , Drag.prototype );
  53. ChildDrag.prototype.fnMove = function(ev){
  54. var L = ev.clientX - this.disX;
  55. var T = ev.clientY - this.disY;
  56. if(L<0){
  57. L = 0;
  58. }
  59. else if(L>document.documentElement.clientWidth - this.obj.offsetWidth){
  60. L = document.documentElement.clientWidth - this.obj.offsetWidth;
  61. }
  62. this.obj.style.left = L + ‘px‘;
  63. this.obj.style.top = T + ‘px‘;
  64. };
  65. function extend(obj1,obj2){
  66. for(var attr in obj2){
  67. obj1[attr] = obj2[attr];
  68. }
  69. }
  70. </script>
  71. </head>
  72. <body>
  73. <div id="div1"></div>
  74. <div id="div2"></div>
  75. </body>
  76. </html>

类式继承

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. //类 : JS是没有类的概念的 , 把JS中的构造函数看做的类
  8. //要做属性和方法继承的时候,要分开继承
  9. function Aaa(){   //父类
  10. this.name = [1,2,3];
  11. }
  12. Aaa.prototype.showName = function(){
  13. alert( this.name );
  14. };
  15. function Bbb(){   //子类
  16. Aaa.call(this);
  17. }
  18. var F = function(){};
  19. F.prototype = Aaa.prototype;
  20. Bbb.prototype = new F();
  21. Bbb.prototype.constructor = Bbb; //修正指向问题
  22. var b1 = new Bbb();
  23. //b1.showName();
  24. //alert( b1.name );
  25. //alert( b1.constructor );
  26. b1.name.push(4);
  27. var b2 = new Bbb();
  28. alert( b2.name );
  29. </script>
  30. </head>
  31. <body>
  32. </body>
  33. </html>

原型继承

[html] view
plain
 copy

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. <script>
  7. var a = {
  8. name : ‘小明‘
  9. };
  10. var b = cloneObj(a);
  11. b.name = ‘小强‘;
  12. //alert( b.name );
  13. alert( a.name );
  14. function cloneObj(obj){
  15. var F = function(){};
  16. F.prototype = obj;
  17. return new F();
  18. }
  19. 拷贝继承:  通用型的  有new或无new的时候都可以
  20. 类式继承:  new构造函数
  21. 原型继承:  无new的对象
  22. </script>
  23. </head>
  24. <body>
  25. </body>
  26. </html>
时间: 2024-11-24 08:36:37

JS面向对象及组件开发的相关文章

Vue.js的复用组件开发流程

本文由蔡述雄发表 接下来我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程. 下面先看看我们的需求 列表组件quiList.vue 本节我们主要要完成这样一个列表功能,每一行的列表是一个组件,列表内可能出现按钮组件或者箭头组件,点击按钮组件可以自定义事件,同时可以根据不同的参数来决定当前列表是带按钮的列表or带箭头的列表. 首先看看quiList.vue //quiList.vue <template> <div class="qui-list"> &

js组件开发-移动端地区选择控件mobile-select-area

移动端地区选择控件mobile-select-area 由于之前的[js开源组件开发]js手机联动选择地区仿ios 开源git 很受欢迎,于是我又对其进行了一些优化,包括可选的范围变大了,添加了默认空首地址的功能,也添加了更多api参数,首先我们先来看下这次的效果图. 它的github地址请点击https://github.com/tianxiangbing/mobile-select-area 它的demo演示请点击 http://www.lovewebgames.com/jsmodule/m

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须

[js开源组件开发]localStorage-cache本地存储的缓存管理

localStorage-cache本地存储的缓存管理 距离上次的组件开发有近三个月的时间了,最近一直在做一些杂事,无法静下心来写写代码,也是在学习emberjs,在emberjs中有一个很重要的东西 -- localstorage_adapter,本地存储适配器,利用它可以很方便的把数据保存在本地的localStorage中,但我今天要讲的,并不是ember,也不是适配器,我是个比较念旧的人,所以我对cookie很情有独钟,当然,cookie也会有各种问题,于是我就来改造下localStora

[js开源组件开发]query组件,获取url参数和form表单json格式

query组件,获取url参数和form表单json格式 距离上次的组件[js开源组件开发]ajax分页组件一转眼过去了近二十天,或许我一周一组件的承诺有了质疑声,但其实我一直在做,只是没人看到……,最近项目紧,几个小组,只有我一个前端,公司对前端的定位不清晰,导致前端人员过少的情况.所以还得促进公司前端人员增长,不然再这么玩下去,我要被玩死了,一个公司,不可能靠一个资深前端来支撑二三十个开发的需求,这是不现实的,特别是现在的页面不再是复制粘贴的前况下.我默默耕芸,所以这次我整理了这一个月里所有

[js开源组件开发]数字或金额千分位格式化组件

数字或金额千分位格式化组件 这次距离上一个组件<[js开源组件开发]table表格组件>时隔了一个月,由于最近的项目比较坑,刚挖完坑,所以来总结性提出来几个组件弥补这次的空缺,首先是金额和数字的千分位和小数点控制的组件,它的作用主要是在输入框时限制输入的内容为数字.也可以用于普通标签的数字格式化,效果如下图: demo演示地址请点击 http://www.lovewebgames.com/jsmodule/format-number.html 源码github托管地址请点击https://gi

[js开源组件开发]network异步请求ajax的扩展

network异步请求ajax的扩展 在日常的应用中,你可能直接调用$.ajax是会有些问题的,比如说用户的重复点击,比如说我只希望它成功提交一次后就不能再提交,比如说我希望有个正在提交的loading效果.所以我做network这个组件来扩展$.ajax,希望全中国的人民们喜欢. 这里使用到了上篇[js开源组件开发]loading加载效果 一个loading效果,但为了让它独立运行,所以没有进行引用,而是直接做了一个loading方法在里面.它的具体效果图如下: 它的实例DEMO地址请点击这里

新手如何理解JS面向对象开发?

今天有时间讲讲我对面向对象的理解跟看法,尽量用通俗的语言来表达,多多指教! 如今前端开发已经越来越火了,对于前端开发的要求也是越来越高了,在面试中,经常有面试官会问:你对JS面向对象熟悉吗? 其实,也就是相当于在问你,在工作中有没有用过面向对象开发?说到这里,有人就问了,什么事面向对象? 面向对象: 用我个人最简单的理解表达就是,Object的操作.另外一种理解: 给你一个条件,你去找个对象帮我处理这个事情,你就不要自己动手了. 说白了,我们就是在操作对象,那么我们就需要去创建这个对象,创建对象

javascript组件开发之基类继承实现

上一篇文章大概的介绍了一下关于javascript组件的开发方式,这篇文章主要详细记一下基类的编写,这个基类主要是实现继承的功能 为什么要封装基类? 由于这次重构项目需要对各种组件进行封装,并且这些组件的实现方式都差不多,为了便于管理,让代码尽量统一,所以到对组件封装一个base基类(javascript没有类的概念,暂且这样叫吧),关于javascript的oo实现:可以参考这篇文章javascript oo实现:写得很赞,膜拜,我改写的这个基于John Resig的实现方式. 基类的封装方式