Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.95 KB | None | 0 0
  1. # 面向对象---继承 八大继承 枚举 #
  2. ```
  3.  
  4.  
  5. 1.原型链继承
  6. //父类
  7. function Person(){
  8. this.name ="曹德申";
  9. this.age="41";
  10. this.sex ="男";
  11. }
  12. Person.prototype.running=function(){
  13. console.log("跑得快")
  14. }
  15. //子类
  16. function Children(){
  17. this.score=100;
  18. }
  19. //通过原型链 实现继承关系
  20. //父类的实例化对象 赋值给 子类的原型
  21. Children.prototype =new Person();
  22.  
  23. var Children1 =new Children();
  24. console.log(Children1.age);
  25. Children1.running();
  26. //动物类
  27. function Animal(){
  28. this.name="大象";
  29. this.age="0.3";
  30. var wifi="abc"; //私有属性 外界无法访问
  31. this.running=function(){
  32. console.log("干净跑");
  33. return wifi;//在共有方法中 返回私有属性,宫外界获取
  34. }
  35. }
  36. //原型链继承 : 本质 重新子类的原型
  37. xiaoke.prototype=new Animal()
  38. //猫类
  39. function xiaoke(){
  40. this.name="小可";
  41. this.color="黑白";
  42. this.eatting=function(){
  43. console.log("还不知道鱼的味道");
  44.  
  45. }
  46. }
  47.  
  48. var miao=new xiaoke();
  49. // console.log(miao.name);
  50. var a =miao.running();
  51.  
  52. //原型链继承中,父类的私有属性只要能被外界访问的,同样可以继承过来
  53. console.log(a);//接受共有方法的私有属性,并使用
  54. console.log(miao.wifi)
  55.  
  56. //原型链继承:子类能够继承父类所有的属性和方法(包括原型中的)
  57. //在继承过程中: 1.如果父类和子类有相同,优先子类的为准
  58. // 2.子类可以使用父类的方法和属性,但父类无法使用子类的
  59. var xiang =new Animal();
  60. // console.log(xiang.color);
  61. // console.log(xiang.name)
  62. // console.log(xiang.wifi);
  63.  
  64. 2.类式继承
  65. //类式继承:也叫构造函数继承
  66. function Person(name,sex){
  67. this.name=name;
  68. this.sex=sex;
  69. this.lala=function(){
  70. console.log("2222")
  71. }
  72. }
  73.  
  74. Person.prototype.stu=function(){
  75. console.log("早上好~~起来")
  76. }
  77.  
  78. function ThisMe(name,sex){
  79. this.color="yellow";
  80. //被调用者。call(调用者,所需要的参数);
  81. //call():谁调用这个方法,将谁借过来;
  82. //参数1:借过来的方法 的 使用者
  83. //参数2:借过来的方法 所需要的参数(没有即不写)
  84. // Person.call(this,name,sex);
  85.  
  86. //被调用者,apply(调用者,所需要的参数);
  87. Person.apply(this,[name,sex]);
  88. }
  89. var per=new Person("老王","男")
  90. console.log(per)
  91. var me=new ThisMe("小王","女");
  92. console.log(me);
  93.  
  94.  
  95.  
  96. 3.组合继承
  97. //组合继承 是原型链继承和类式继承的结合使用
  98. //既可以通过类式继承给父类传参,也可以通过原型链继承来获取父类原型的内容
  99. //是js中 较为常用的继承方式
  100. function Father(name,age){
  101. this.name=name;
  102. this.age=age;
  103. this.hobby="玩";
  104. }
  105. Father.prototype.money=function(){
  106. console.log("我也不知道")
  107. }
  108. function my(name,age){
  109. this.name=name;
  110. this.job="累成狗";
  111.  
  112. //使用类式继承,调用父类的构造函数
  113. //父类所需的参数,可以在这里传递
  114. Father.apply(this,[name,age]);
  115. }
  116.  
  117. //原型链继承。可以继承到父类原型中的内容
  118. my.prototype =new Father();
  119.  
  120. //子类实力化对象
  121. var me=new my("曹**","41");
  122. console.log(me);
  123.  
  124. 4.拷贝继承
  125. //拷贝继承:他的本质意义就是将一个对象的所有属性/方法,赋值给另一个对象的原型,以此来达到继承的效果
  126. //优点:支持多继承
  127. //缺点:1.效率较低,内存占用高(因为要拷贝父类的属性)
  128. // 2.无法获取父类的不可枚举的方法(不可枚举的方法,不能使用for in 访问到)
  129. //父类(超类)
  130. function Animal(name){
  131. //属性
  132. this.name= name || "Animal";
  133. //实例方法
  134. this.sleep =function(){
  135. console.log(this.name +"正在睡觉")
  136. }
  137. }
  138. Animal.prototype.eat=function(food){
  139. console.log(this.name+"正在吃"+food)
  140. }
  141.  
  142. //开始拷贝继承
  143. function Cat(name,sex){
  144. //实力化父类
  145. var animal =new Animal(sex);
  146. for (var k in animal) {
  147. Cat.prototype[k] = animal[k];
  148. }
  149. Cat.prototype.sex = name || "Tom";
  150. }
  151. var cat =new Cat("小辉","瘦子");
  152. console.log(cat.name)
  153.  
  154. //新的父类
  155. function Xing(ooo){
  156. this.name=ooo || "曹瑞";
  157. }
  158. Xing.prototype.xxxx=function(){
  159. console.log("就哈哈哈哈");
  160. }
  161.  
  162. function Zi(name,yy){
  163. var hua=new Xing(name);
  164. var animal =new Animal(yy);
  165.  
  166. for(var x in hua){
  167. Zi.prototype[x] = hua[x];
  168. }
  169. for (var k in animal) {
  170. Zi.prototype[k] = animal[k];
  171. }
  172.  
  173. Zi.prototype.han=function(){
  174. console.log("我来了");
  175. }
  176. }
  177.  
  178. var s=new Zi("名字","哈哈哈");
  179. console.log(s.name);
  180.  
  181.  
  182.  
  183.  
  184.  
  185. 5.实例继承
  186. //实例j继承:为父类实例添加新特性,作为子类实例返回
  187. function Animal(){
  188. this.nema="join";
  189. }
  190. Animal.prototype.eat=function(){
  191. console.log("我能在从好吃的")
  192. }
  193. //子类
  194. function Cat(){
  195. var animal=new Animal();
  196. animal.age=19;
  197. animal.sex="男";
  198.  
  199. return animal;
  200. }
  201.  
  202. function Bat(){
  203. var cat=new Cat();
  204.  
  205. for(var k in cat){
  206. console.log(cat[k])
  207. }
  208. return cat;
  209. }
  210.  
  211. var c=new Bat();
  212. console.log(c.nema);
  213.  
  214.  
  215.  
  216.  
  217.  
  218. 6.原型式继承
  219. //父类(超类)
  220. function Animal(){
  221. this.name="小辉";
  222. this.age=18;
  223. }
  224. Animal.prototype.eat=function(){
  225. console.log("小猴爱吃香蕉")
  226. }
  227. //原型式继承:用一个函数包装一个对象,然后返回这个函数的调用
  228. // 这个函数就变成一个可以随意增添的属性/方法对象
  229.  
  230. //特点:类似一个复制了一个对象,用函数来包装
  231. //缺点:1.所有实例都会继承原型上的属性
  232. // 2.无法实现复用(因为所有的新属性都是后面添加的)
  233.  
  234. function content(obj){
  235. function F(){};
  236. F.prototype =obj; //继承传入的参数
  237.  
  238. return F(); //返回函数的执行的结果
  239. }
  240.  
  241. var sup=new Animal();
  242.  
  243. //content():这个是自定义的函数
  244. //作用: 1.它可以返回一个对象
  245. // 2.将谁作为参数传入该方法,谁将会被新的对象继承
  246. var son =content(sup);//把父类传参
  247. 7.寄生式继承
  248. //父类(超类)
  249. function Animal(){
  250. this.name="小辉";
  251. this.age=18;
  252. }
  253. Animal.prototype.eat=function(){
  254. console.log("小猴爱吃香蕉")
  255. }
  256.  
  257. function content(obj){
  258. function F(){};
  259. F.prototype =obj; //继承传入的参数
  260.  
  261. return new F(); //返回函数的执行的结果
  262. }
  263.  
  264. var sup=new Animal();
  265.  
  266. // var son =content(sup);//把父类传参
  267. // son.name="llll";
  268. // console.log(son.name);
  269. //以上是原型继承
  270.  
  271. //给原型式继承在套个壳子传递参数,便是寄生式继承
  272. function shell(obj){
  273. var sub=content(obj);
  274. sub.a="gir";
  275. return sub;
  276. }
  277.  
  278. var hehe=shell(sup);
  279. console.log(typeof shell);
  280. console.log(typeof hehe);
  281.  
  282.  
  283.  
  284. 8.寄生式组合继承
  285.  
  286. 操作符
  287. //1.instanceof:判断一个实例对象 是否是某个函数的实例
  288. // 对象名 instanceof 函数名
  289. function Animal(){
  290. this.nema="join";
  291. }
  292. Animal.prototype.eat=function(){
  293. console.log("我能在从好吃的")
  294. }
  295.  
  296. function Son(){
  297. // this.a=10;
  298. // var ss=new Animal();
  299. //
  300. // return ss;
  301. //
  302. // var animal =new Animal();
  303. //
  304. // for (var k in animal) {
  305. // Son.prototype[k] = animal[k];
  306. // }
  307. // Animal.apply(this,);
  308. }
  309. // Son.prototype=new Animal();
  310. var s1=new Son();
  311. console.log(s1 instanceof Son);
  312. console.log(s1 instanceof Animal);
  313.  
  314. //2.isprototypeof(); 只要是原型链中出现过的原型,都可以说是该原型链产生的原型
  315.  
  316. //原型名。isprototypeof(对象名)
  317. //简述:会从s1开始沿着原型链逐层向上找,看看有没一个叫Son.prototype的
  318. console.log(Son.prototype.isPrototypeOf(s1))
  319.  
  320. 枚举
  321. //枚举: 是由一个或一组叫做 元素,成员,属性值组成的数据类型
  322. // 枚举成员的名字,在编程中通常充当标识符直接使用。同时它也可以被任意的属性所赋值
  323.  
  324. //可枚举性(enumerable): 用来控制所描述的属性,是否将被包括在for...in之中;
  325. // 如果一个属性的enumerable值为false,下面的三个操作无法取到该属性
  326. // for...in循环
  327. // Obejct.keys()方法
  328. // JSON.stringify()方法
  329. var o = {};
  330. o.a = 1;
  331. o.b = 2;
  332. o.c = 3;
  333. //给Object的原型中添加指定的对象,给该对象添加指定的属性,指定的属性值
  334. //参数 1: 对象名
  335. //参数 2: 属性名
  336. //参数 3: 属性值
  337. // enumerable : 布尔值 控制该属性是否为可枚举类型
  338. Object.defineProperty(o,"d",{
  339. value : 4,
  340. enumerable : false
  341. });
  342. console.log(o.d);
  343. for(var k in o){
  344. console.log(o[k]);
  345. }
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement