JavaScript面向对象 -- 笔记 - 图2review0604

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>JavaScript面向对象</title>
  6. </head>
  7. <body>
  8. </body>
  9. <script type="text/javascript">
  10. // JavaScript对象声明的六种方式
  11. // 一、字面量声明
  12. // 通过obj.属性名或obj.方法名()就可以读取或调用对象的属性/方法了
  13. var obj = {
  14. name1 : value1,
  15. name2 : value2,
  16. name3 : value3,
  17. fn1 : function(){},
  18. fn2 : function(){}
  19. }
  20. // 二、用new操作符构造Object对象
  21. // 首先用new Object()创建一个空对象,然后用多条语句给对象添加属性/方法。
  22. var obj = new Object();
  23. obj.name1 = value1;
  24. obj.name2 = value2;
  25. obj.name3 = value3;
  26. obj.fn1 = function(){};
  27. obj.fn2 = function(){};
  28. // 三、用函数声明的方式构造对象
  29. // 通过这种方式声明的对象,每一次new出来的对象都是独立的,互相不会有影响,属性、方法中的this指向的就是新创建的、调用他们的对象。
  30. function person(name,age){
  31. this.name = name;
  32. this.age = age;
  33. this.say = function(){
  34. console.log('My name is' + this.name + ', I\'m' + this.age + 'years old');
  35. }
  36. }
  37. var xiaoMing = new person('xiaoMing',16);
  38. xiaoMing.say();//"My name is xiaoming, I'm 16 years old"
  39. // 四、工厂模式声明对象
  40. // 每一次调用function 声明的函数时,它在内部new Object(),最后将这个新建的对象return回来,调用时就像普通函数调用一样,实例化的时候不用再new了(内部new过)。虽然多次调用该函数走的都是一样的流程,但是生产出来的两个产品互不影响。
  41. function person(name,age){
  42. var obj = new Object();
  43. obj.name = name;
  44. obj.age = age;
  45. obj.say = function(){
  46. console.log('My name is' + obj.name + ', I\'m' + obj.age + 'years old');
  47. };
  48. return obj;
  49. }
  50. var xiaoMing = person('xiaoMing',16);
  51. xiaoMing.say();//"My name is xiaoming, I'm 16 years old"
  52. var xiaoHong = person('xiaoHong',18);
  53. xiaoHong.say();//"My name is xiaoming, I'm 18 years old"
  54. // 五、原型方式声明对象
  55. // 原型方式是将该对象的属性/方法写在他的prototype属性所指的对象上。
  56. // 这有点像JS上常说的事件代理/委托。事件不直接绑定在该DOM元素上,而是绑定在它的父级元素,当给该DOM元素添加兄弟元素时,兄弟元素因为冒泡,能触发相同的事件。
  57. function person() {/*空*/};
  58. person.prototype.height = "1.80m";
  59. person.prototype.grade = "Senior 3";
  60. person.prototype.say = function() {
  61. console.log( 'I\'m ' + this.height + ' tall and I\'m in '+ this.grade);
  62. }
  63. var xiaoMing = new person();
  64. xiaoMing.say(); //"I'm 1.80m tall and I'm in Senior 3"
  65. // 六、混合模式
  66. // 混合模式可以理解成原型模式+构造函数
  67. // 对比混合模式和原型模式可以发现,混合模式函数体不是空的,而函数体内的内容就是前边说的构造方式。
  68. function person(name, height) {
  69. this.name = name;
  70. this.height = height;
  71. };
  72. person.prototype.age = 18;
  73. person.prototype.grade = "Senior 3";
  74. person.prototype.say = function() {
  75. console.log('Hello, my name is ' + this.name + '. I\'m ' + this.age + ' years old, ' + this.height + ' tall and I\'m in '+ this.grade + '.');
  76. }
  77. var xiaoMing = new person('Xiaoming', '1.80m');
  78. xiaoMing.say();//"Hello, my name is Xiaoming. I'm 18 years old, 1.80m tall and I'm in Senior 3."
  79. var xiaoHong = new person('Xiaohong', '1.65m');
  80. xiaoHong.say();//"Hello, my name is Xiaohong. I'm 18 years old, 1.65m tall and I'm in Senior 3."
  81. // 闭包
  82. // 闭包是一个拥有很多变量和绑定了这些变量的环境的表达式(通常就是一个函数)
  83. function a(){
  84. var i= 0;
  85. function b(){
  86. alert(++i);
  87. }
  88. return b;
  89. }
  90. var c = a();
  91. c();//特点:函数b实在a内嵌套的,函数a需要返回函数b
  92. //用途:1、读取函数内部变量 2、让i变量得值保存在内存中
  93. function f1(){
  94. var n = 99;
  95. nAdd = function (){
  96. n=n+1;
  97. }
  98. function f2(){
  99. alert(n);
  100. }
  101. return f2;
  102. }
  103. var rs = f1();
  104. rs();//99
  105. nAdd();
  106. rs();//100 -- rs就是f2函数的闭包函数
  107. </script>
  108. </html>

review0605

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>review0605</title>
  6. </head>
  7. <body>
  8. </body>
  9. <script type="text/javascript">
  10. // 封装
  11. function A(){
  12. function _xx(){
  13. alert(111);
  14. }
  15. this.xx = function(){
  16. return _xx;
  17. }
  18. }
  19. A.prototype = {
  20. oth:function(){
  21. alert(222);
  22. }
  23. }
  24. var a = new A();
  25. alert(a.xx()());
  26. a.oth();
  27. // 继承 案例一
  28. var person = function(){
  29. person.prototype.say = function(){
  30. alert(333);
  31. }
  32. }
  33. person.prototype.salary = 500;
  34. var programmer = function(){}
  35. programmer.prototype = new person();
  36. programmer.prototype.wcd = function(){
  37. alert(444);
  38. }
  39. programmer.prototype.salary = 1000;
  40. var p = new programmer();
  41. p.say();//可以调用
  42. p.wcd();//可以调用
  43. // 继承 案例二
  44. function person(name,age){
  45. this.name = name;
  46. this.age = age;
  47. }
  48. person.prototype.sayHello = function(){
  49. alert('属性值name:' + this.name);
  50. }
  51. function student(){};
  52. student.prototype = new person('lisi',18);
  53. student.prototype.grade = 3;
  54. student.prototype.test = function(){
  55. alert(this.grade);
  56. }
  57. var s = new student();
  58. s.sayHello();
  59. alert(s.grade);
  60. // 构造继承
  61. function parents(name){
  62. this.name = name;
  63. this.say = function(){
  64. alert('父亲的名字:' + this.name);
  65. }
  66. }
  67. function child(name,age){
  68. // 继承parent
  69. this.pObj = parents;
  70. // 子对象的参数name传递到父对象中
  71. // 用父对象来创建子对象
  72. this.pObj(name);
  73. // parents(name)
  74. this.age = age;
  75. this.sayC = function(){
  76. alert('child:' + this.name + ' ' + 'age:' + this.age);
  77. }
  78. }
  79. var p = new parents('zhangsan');
  80. p.say();
  81. var c = new child('lisi',20);
  82. c.sayC();
  83. // call apply
  84. function parents(name,age,len){
  85. this.name = name;
  86. this.age = age;
  87. this.len = len;
  88. this.say = function(){
  89. alert(this.name + this.age + this.len);
  90. }
  91. }
  92. //call继承
  93. function student(name,age){
  94. parents.call(this,name,age);
  95. }
  96. //apply继承
  97. function teacher(name,age,len){
  98. parents.apply(this,[name,age,len]);
  99. }
  100. //实例化
  101. var per = new parents('zhangsan',25,180);
  102. per.say();
  103. var stu = new student('lisi',20);
  104. stu.say();
  105. var tea = new teacher('wangwu',28,178);
  106. tea.say();
  107. // 多继承
  108. function fun1(){
  109. fun2.call(this);
  110. fun3.apply(this,['play','aa']);
  111. }
  112. function fun2(){
  113. this.name = 'zhangsan';
  114. this.eat = function(){
  115. alert('eating');
  116. }
  117. }
  118. function fun3(paly,name){
  119. this.paly = play;
  120. this.name = name;
  121. }
  122. var car = new fun1();
  123. alert(car.name);
  124. alert(car.play);
  125. car.eat();
  126. // 对象冒充
  127. function person(name,age){
  128. this.name = name;
  129. this.age = age;
  130. this.sayHi = function(){
  131. alert('Hello world!');
  132. }
  133. }
  134. person.prototype.walk = function(){
  135. alert('walk around');
  136. }
  137. function student(name,age,grade){
  138. this.newObj = person;
  139. // 冒充person对象 传递特权属性和特权方法给子类
  140. this.newObj(name,age);
  141. this.grade = grade;
  142. }
  143. var stu1 = new student('zhangsan',15,5);
  144. alert(stu1.grade);
  145. alert(stu1.age);
  146. alert(stu1.name);
  147. alert(stu1.sayHi);
  148. stu1.walk();//调用共有方法是报错的
  149. // 注意:stu1 继承了person的特权属性和特权方法,但是没有继承共有属性和共有方法
  150. </script>
  151. </html>