学习时间 完成时间 ✅ 重难点 疑问/遗漏
复习时间
  1. 计算器插件
  2. ;(function(){
  3. var Compute=function(){}
  4. Compute.prototype={
  5. plus: function(a,b){
  6. return a+b;
  7. },
  8. munus:function(a,b){
  9. return a-b;
  10. },
  11. mul:function(a,b){
  12. return a*b;
  13. },
  14. div:function(a,b){
  15. return a/b;
  16. }
  17. }
  18. window.Compute=Compute;
  19. })();
  20. var compute=new Compute();
  21. compute.munus(1,2)
  1. 通过改变this的指向,公用属性(这种方式无法继承Teacher的原型)
  2. Teacher.prototype.wife='Ms.Liu';
  3. function Teacher(name,mSkill){
  4. this.name=name;
  5. this.mSkill=mSkill;
  6. }
  7. function Student(name,mSkill,age,major){
  8. Teacher.apply(this,[name,mSkill]);
  9. this.age=age;
  10. this.major=major;
  11. }
  12. var student=new Student('Mr.Zhang','JS/JQ',18,'Computer')
  13. console.log(student.wife) //undefined
  14. 公共原型
  15. function Teacher(){
  16. this.name='Mr.Cao';
  17. this.tSkill='JAVA';
  18. }
  19. Teacher.prototype={
  20. pSkill:'JS/JQ'
  21. }
  22. var t=new Teacher();
  23. console.log(t)
  24. function Student(){
  25. this.name='Mr.zhang'
  26. }
  27. Student.prototype=Teacher.prototype;
  28. Student.prototype.age=18;
  29. var s=new Student();//将Teacher的prototype赋值给Student的原型,此时改变Student的原型,
  30. Teacher的原型也跟着改变了

image.png

继承

圣杯模式

  1. 实现继承又不改变父元素的原型的实现方式
  2. 圣杯模式
  3. function Teacher(){
  4. this.name='Mr.Li';
  5. this.tSkill='JAVA';
  6. }
  7. Teacher.prototype={
  8. pSkill:'JS/JQ'
  9. }
  10. var t=new Teacher();
  11. function Student(){
  12. this.name='Mr.Wang';
  13. }
  14. function Buffer(){}
  15. Buffer.prototype=Teacher.prototype;
  16. var buffer=new Buffer();
  17. Student.prototype=buffer;
  18. Student.prototype.age=18;
  19. var s=new Student();
  20. console.log(s) //此时给Student添加原型属性,将不会改变Teacher的原型
  21. 封装的写法
  22. 方式一
  23. function inherit(Target,Origin){
  24. function Buffer(){}
  25. Buffer.prototype=Origin.prototype;
  26. Buffer.prototype=new Buffer();
  27. Target.prototype.constructor=Target;
  28. Target.prototype.super_class=Origin;
  29. }
  30. 方式二(模块化开发)
  31. var inherit=(function(){
  32. var Buffer=function(){};
  33. return function(Target,Origin){
  34. Buffer.prototype=Origin.prototype;
  35. Buffer.prototype=new Buffer();
  36. Target.prototype.constructor=Target;
  37. Target.prototype.super_class=Origin;
  38. }
  39. })();
  40. function Teacher(){}
  41. function Student(){}
  42. inherit(Student,Teacher);
  43. var s=new Student();
  44. var t=new Teacher();
  45. 当使用构造函数的时候,每次实例化的时候,构造函数都会return this
  46. 如果显示的写return {},则会返回return {},如果是基本数据类型则会不生效,依旧返回this

MDN上的对象原型

原型链的定义

JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。

原型的定义

在javascript中,函数可以有属性。每个函数都有一个特殊的属性叫做原型(prototype)
constructor是原型上的一个属性,该属性指向用于构造此实例对象的构造函数

  1. function doSomething(){}
  2. console.log( doSomething.prototype );
  3. //如何声明函数并不重要
  4. var doSomething = function(){};
  5. console.log( doSomething.prototype );

image.png
⚠️

  1. function Foo(){
  2. this.a=1;
  3. }
  4. var foo=new Foo();
  5. Foo.prototype={
  6. aa:10
  7. }
  8. console.log(foo.aa);//undefined 要在实例化之前改变数据,才可以访问到

原型链的继承方式

  1. 1、原型链继承; 引来 引用值共享问题
  2. 2、构造函数继承; 没办法拿到父级原型链上的方法
  3. 3、组合继承; (伪经典继承)
  4. 4、寄生组合继承; (经典继承)
  5. 5、圣杯模式
  6. 6extends 继承
  7. function Super(){
  8. this.a='111';
  9. this.b=[1,2,3,4,5]
  10. }
  11. Super.prototype=function(){
  12. console.log(222)
  13. }
  14. function Sub(){
  15. }
  16. Sub.prototype=new Super();
  17. var sub1=new Sub();
  18. var sub2=new Sub();
  19. sub1.a='222';
  20. sub1.b.push(6)
  21. console.log('sub1',sub1)
  22. console.log('sub2',sub2)
  23. 引发的问题:引用值共享问题
  24. 措施:使用构造函数的方式
  25. 但是构造函数类型的继承,没有办法拿到原型上的方法
  26. 我们需要使用组合继承的方式(伪经典继承)=>
  27. 寄生组合继承 缺点:Sub.prototype=Object.create(Super.prototype);自组建的原型有可能被覆盖=>
  28. 解决方案 圣杯模式
  29. function Sub(){
  30. Super.call(this)
  31. }
  32. // Sub.prototype=new Super();
  33. var sub1=new Sub();
  34. var sub2=new Sub();
  35. sub1.a='222';
  36. sub1.b.push(6)
  37. console.log('sub11',sub1)
  38. console.log('sub22',sub2)
  39. 组合继承,就可以拿到原型上的方法
  40. function Sub(){
  41. Super.call(this)
  42. }
  43. Sub.prototype=new Super();
  44. 寄生组合继承
  45. function Sub(){
  46. Super.call(this)
  47. }
  48. Sub.prototype=Object.create(Super.prototype);

image.png
image.png