《你不知道的js(中卷)》混合对象“类”(代码片段)

lalal lalal     2022-12-26     669

关键词:

四、混合对象“类”:

? 在研究类的具体机制之前,首先介绍 面向类的设计模式:实例化(instantiation)、继承(inheritance)和(相对)多态(polymorphism)。

一)、类理论:

? 面向对象编程强调的是数据和操作数据的行为本质上是互相关联的。

1、“类“设计模式:

? 类是一种设计模式,有多种高级设计模式建立在面向对象类的基础上:迭代器模式、观察者模式、工厂模式、单例模式等等

2、JavaScript中的”类“:

? 尽管ES6中加入了class关键字,但是JS中实际上并没有类。由于类是一种设计模式,因此可以用一些方法近似实现类的功能。

二)、类的机制:

? 在面向类的语言中,必须将类实例化才可以对抽象化的类进行操作。

  • 类通过复制操作被实例化为对象形式;
  • 类实例是由一个特殊的类方法共造的,这个方法名通常和类名相同,被称为构造函数;

三)、类的继承:

? 我们常说子类继承父类,但是用子类DNA是继承父类DNA会更好理解。类通过继承和方法重写实现多态。

  • 多态并不表示子类和父类有关联,子类得到的只是父类的一份副本。类的继承其实就是复制。

  • 在大多数面向类语言中,可以使用super来在子类中引用父类。

  • 有些语言允许多重继承,这样会导致”钻石继承“,但是JS本身并不提供多重继承。

四)、混入:

? 在继承或者实例化时,JS的对象机制并不会自动执行复制行为。即JS中只有对象,并不存在可以被实例化的“类”。JS使用 混入来模拟类的复制行为。

1、显式混入:

function mixin(sourceObj, targetObj) 
  for (var key in sourceObj) 
    // 只会在不存在的情况下复制
    if (!(key in targetObj)) 
      targetObj[key] = sourceObj[key];
    
  
  return targetObj;


var Vehicle = 
  engines: 1,
  ignition: function () 
    console.log("...")
  ,
  drive: function () 
    this.ignition();
  
;

var Car = mixin(Vehicle, 
  wheels: 4,
  drive: function() 
    Vehicle.drive.call(this);
    console.log("...");
  
)
  • 函数实际上没有被复制,复制的是函数引用。

  • Vehicle.drive.call(this);就是我们所说的显式多态,这里利用显式绑定调用Vechicle对象的drive方法,并把this绑定在Car对象上,确保drive()在Car对象的上下文中执行。

  • 使用显式伪多态会使代码更加复杂、难以阅读并且南移维护。

  • 此外还有 混合复制、寄生继承两种显式混入。

2、隐式混入:

? 类似显式伪多态,具有一样的问题。

五)、小结:

? 类意味着复制,传统的类被实例化时,它的行为会被复制到实例中。类被继承时,行为也会被复制到子类中。

? 混入模式可以用来模拟类的复制行为,但是通常会产生丑陋并且脆弱的语法。此外,显式混入实际上无法完全模拟类的复制行为,因为对象只能复制引用,无法复制被引用的对象或者函数本身。

? 总结,在JS中模拟类得不偿失。

《你不知道的js(中卷)》对象(代码片段)

三、对象:一)、语法:对象有两种形式定义:声明(文字)形式:varmyObj=key:value//...;构造形式:varmyObj=newObject();myObj.key=value;在声明形式中可以添加多个键/值对,但是在构造形式中必须逐个添加属性。1、类型:? 对象是JS的基... 查看详情

《你不知道的js(中卷)》关于this(代码片段)

一、关于this:一)、为什么要用this?functionidentity() returnthis.name.toUpperCase();varme= name:"Kyle";varyou= name:"Reader";identity.call(me);//Kyleidentity.call(you);//Reader? 观察上面的代码,使 查看详情

《你不知道的js(中卷①)》语法(代码片段)

五、语法:? 语法(grammar)与词法(syntax)不同。后者强调语言的运算符、关键字等。而语法定义了此法规则是如何构成可运行的程序代码的。一)、语句和表达式:语句(statement)与表达式(expression),举例说明:vara=3*6;a=3*6... 查看详情

你不知道的js-混合对象-类

1、类是一种设计模式,许多语言提供了对于面向类软件设计的原生语法,js中也有类似的语法,但是和其他语言中的类完全不同。2、类意味着复制3、js并不会像类那样自动创建对象的副本。4、在继承或者实例化时,js的对象机... 查看详情

你不知道的javasscript上篇·第四章·混合对象·类(代码片段)

一、类的理论1、类的核心概念:多态是说父类的通用行为可以被子类用更特殊的行为重写二、类的机制1、构造函数类实例是有一个特殊的类方法构造的,这个方法名通常和类名一致;类构造函数属于类,构造函数大多需要用new... 查看详情

你不知道的javascript(中卷)笔记

<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>你不知道的javascript(中卷)</title></head><body><scripttype="text/javascript">/*//封装对象包装vara=newBool 查看详情

《你不知道的javascript[中卷]》14——asynquence附录

 《你不知道的JavaScript[中卷]》【14】——asynquence附录 查看详情

《你知道的javascript》——混合对象类(代码片段)

我今天的问题是关于这三个功能:publicvoidgenerateCalendarEvents(finalStringid,finalMap<String,String>params);publicvoidgenerateCalendarEvents(Objectobject,finalStringid,finalMap<String,String>params);publ 查看详情

你不知道的js系列(33)-对象复制(代码片段)

JS初学者最常见的问题之一就是如何复制一个对象。看起来应该有一个内置的copy()方法,实际上比想象中的更复杂,我们无法选择一个默认的复制算法functionanotherFunction()/**...*/;varanotherObject=c:true;varanotherArray=[];varmyObject=  a:2, ... 查看详情

《你不知道的javascript[中卷]》13——程序性能

                                 &n 查看详情

你不知道的javascript(中卷)pdf

下载地址:网盘下载   内容简介  · · · · · ·JavaScript这门语言简单易用,很容易上手,但其语言机制复杂微妙,即使是经验丰富的JavaScript开发人员,如果没有认真学习的话也无法真正理解... 查看详情

你不知道的js系列(39)-对象遍历(代码片段)

for循环可以遍历数组varmyArray=[1,2,3];for(vari=0;i<myArray.length;i++)  console.log(myArray[i])//123ES5增加了数组的辅助迭代器,包括forEach(...)、every(...)、some(...)forEach(...)会遍历数组中的所有值并忽略回调函数的返回值every(...)会一直运行直... 查看详情

你不知道的js系列(29)-对象属性(代码片段)

存储在对象容器内部的是这些属性的名称,它们就像指针(从技术角度来说是引用)一样,指向这些值真正的存储位置。 varmyObject=  a:2myObject.a;//2myObject[‘a‘];//2.语法通常被称为‘属性访问’,[]语法通常被称为&lsqu... 查看详情

《你不知道的javascript[中卷]》——类型&值

                  类型定义了值的行为特征             &nb 查看详情

《你不知道的javascript[中卷]》12——生成器

     双向消息系统:     应该是花了很长的篇幅来举例交替执行——-->有点像coding的regularexpression那后面应该会有更牛逼的语法糖出来?        &nbs 查看详情

你不知道的js系列(22)-thisnew绑定(代码片段)

在传统的面向类的语言中,“构造函数“是类中的一些特殊方法,使用new初始化类时会调用类中的构造函数。通常的形式是这样的something=newMyClass(..);然而JavaScript中new的机制实际上和面向类的语言不同。它们只是被new操作... 查看详情

你不知道的js系列(30)-对象属性(可计算属性名)(代码片段)

如果你需要通过表达式来计算属性名,[]操作符就派上用场了。ES6中使用[]包裹一个表达式来当作属性名varprefix=‘foo‘;varmyObject=  [prefix+‘bar‘]:‘hello‘,  [prefix+‘baz‘]:‘world‘,myObject[‘foobar‘];//hellomyObject[‘foobaz‘];//world... 查看详情

《你不知道的js》——this全面解析(代码片段)

默认绑定//全局对象用于默认绑定functionfoo()console.log(this.a)vara=2;foo();//2//严格模式下,不能将全局对象用于默认绑定functionfoo()‘usestrict‘;console.log(this.a)vara=2;foo();//TypeError:thisisundefined//在严格模式下调用foo()则不影响默认绑定func 查看详情