javascript取对象属性-JDC丨易设计中心-JavaScript写作班的前世今生

JavaScript自诞生以来已经走过了20个年头。 它的前世(1995~2015)是20年没有类的世界,现在的生活随着2015年6月ES6的发布迎来了类的时代。JavaScript从无“类”到了“类”,经历了从ES1到ES6的阶段。

事实上,不存在“类”(class),但有函数。 这个 function 关键字不仅充当函数/方法,还充当构造函数。 在没有“类”的阶段,一群才华横溢的程序员利用JavaScript的特性,创造了大量的句子糖,一步步接近“类”。

本文分为四个部分

1.原样写类

让我们从最基本的构造函数开始。

1. 构造函数形式

function 不仅仅用作 JavaScript 中的函数、对象技巧。 另一个用途是充当构造函数。 当与内部结合时,它可以模拟一个“类”。

如此定义有以下性质

这种风格让写过Java的程序员有点熟悉,因为构造一个对象需要配置一些参数,而且这些参数必须是类上面的this的形参。

与Java的区别在于使用函数而不是类,参数不需要定义类型。

根据参数可以构造不同的对象实例。 缺点是每个实例对象在构造时都会生成一个getName版本,造成显存的浪费。

为了减少创建对象时方法getName的内存消耗,有程序员提出了一种改进方案

代码风格有点差强人意,没有Java那么紧凑。 但它确实减少了内存消耗。

2. 原型方法

JavaScript默认采用原型继承(prototype-based),包括它的外部API和提供给客户端程序员的继承。 原型还可以用于编写不使用继承的类。

原型的相似点和不同点是

缺点是不能通过参数构造对象实例(通常每个对象的属性都不同)。

优点是所有对象实例共享getName方法(与构造函数形式相比),不会造成内存浪费。

3.构造函数+原型方法

利用以上两点

js如何获取对象的属性_javascript取对象属性_js中获取对象的属性值

这样通过构造函数就可以构造出不同名字的人,并且对象实例都共享getName方法,不会造成显存的浪费。

但实际上,这种代码风格并没有像Java类那样紧凑,属性、构造方法(函数)、技能都用大括号包裹起来。

为了让代码像Java一样紧凑,一个程序员想出了一个非常独特的方式(无法验证是谁第一个这样写的),在函数内部的原型上定义方法。

当我第一次看到这些写作方法时,我深感不安。 这么奇怪的代码能运行吗? 它看起来像递归嵌套。

核实

没有报错,控制台输出正确。 描述可以这样写,虽然很完美。

但是每次都会执行一个新的对象

是什么原因造成了必要的重复操作。 因为getName方法挂在原型上,所以只需要执行一次。

只需要稍微修改一下,添加一个是否初始化的标记_init即可。

2.工具函数编写类

通过前面的知识,我们知道用JavaScript编写类本质上就是构造函数+原型。 了解了之后,你就不会害怕遇到各种写法了。

下面几种写类的方法比较简单易懂,但是每次用这些形式写出冗余的代码,有很多重复的工作。 在日常编码工作中,只要遇到超过2/3次的重复代码,我们自然就会想到用函数封装起来,然后类似的函数只需要调用这个函数即可。 编写类函数应运而生。

1.工具功能1构造函数+原型直接组装一个类,相同的构造函数将组装相同的类型

《工具函数1》只有四行代码,使用构造函数生成类实例的属性(数组),使用原型对象生成类实例。

使用它来写类的例子如下

已经有两个班了,男人,女人。 而且是同一类型。正在测试中

创建男人和女人的对象

一切顺利,一切都如我们所料。 还有一个问题,下面代码的结果输出 false

console.log(man.constructor==Person);//false

这就令人不快了:从上面的代码可以看出,man确实是通过Man类new创建的,所以对象实例man的构造函数应该指向Man,但是却适得其反。

激励是工具函数重绘了Person的原型:c.prototype=p; 我们稍微重写$class,并将方法挂在构造函数的原型上(而不是重绘构造函数的原型)。

请注意注释行(第 9 行)。

2.工具功能2

构造函数+原型组装一个类,同一个构造函数可以定义多种类型

“效用函数2”比“效用函数1”稍微难理解一些。 它返回一个函数,它是一个类/类型。 JavaScript 中函数的强大之处在于它们不仅返回基本类型(值类型、对象类型),还返回函数,并且这个函数有时是函数/方法,有时是类/类型。 这些函数称为高阶函数,是函数式编程语言的主要特征javascript取对象属性,通过它可以执行高度具体的编程范例。 一些中级应用程序依赖于此,例如级联/链式调用、柯里化等。初学者可以阅读和理解。

还是用它定义两个类

与“工具功能1”不同的是,Man和Woman虽然都是用Person,proto. 但男人不等于女人。 即同一个构造函数(Person)可以定义不同的类。

3.工具功能3

与“工具功能1”和“工具功能2”不同的是,第一个参数是类名(字符串),第二个参数是父类,第三个参数是类的实现

像这样定义类

创建对象

如果输出为false,可以看出这个工具类没有维护构造函数属性。 编写类的每一种方法在设计上都有一个选择,这完全取决于设计者的意图。 请注意,使用此实用程序函数编写类时,this.init 方法至关重要。 由于不考虑继承,所以第二个参数superClass使用空字符串,即默认继承自Object。

上面从易到难列出了这三个实用函数。 其目的是将“写类”的动作具体化,减少重复的编码工作。 了解了JavaScript模拟“类”的本质之后,对于理解JavaScript解释器的编写工具功能是有帮助的。

3.类库编写

这里介绍几个有代表性的JavaScript解释器,它们都使用面向对象的方法来组织代码。 因此,就会有特定的书写工具功能。

1.Prototype.js的编写方法

Prototype.js 是一种 JavaScript 解释器,随着 Ajax 的流行于 2006 年开始流行。 它的出现立刻引起了一大批后台程序员的关注。 这正是因为它采用面向对象的方法来组织代码,这让Java、Ruby等面向对象语言的程序员感到友好,可以轻松切换到Web后端,无需过多的学习成本。 解释器作者 Sam Stephenson 也是一名 Ruby 轻度用户,因为他的极客精神公司 37signals 开发了 Ruby on Rails。

Prototype.js使用Class.create编写类,如下

initialize完成对象的初始化,相当于构造函数,是必不可少的。 方法可以依次写下来。

有问题,p.constructor==Person为false,这是Prototype.js.patched的一个小缺陷,如下

原因是之前重新绘制了Person原型。 为了让构造函数指向正确的构造函数,只需要在重绘原型时维护构造函数属性即可。

2.Dojo.js类编写方法

Dojo.js 历史悠久,是一个庞大而全面的框架。 最初由 IBM 基金会维护,现在是一个独立的 Dojo 基金会。 目前jQuery基金会已经被划入基金会之下。 这个基金会人才济济,比如著名的 Commonjs 社区的创始人就来自该基金会,RequireJS 的作者 Jamesburke 也是 Dojo.js 的贡献者。

Dojo使用dojo.declare来定义类,dojo.declare有三个参数

类名 类名

继承类超类

构造函数/方法道具

定义一个简单的类,只需要传递第一个和第三个参数即可,因为这里我们只讨论如何定义一个类,而不考虑继承。

测试表明Dojo正确维护了对象的构造函数属性。

3.ExtJS类的编写方法

ExtJS也是一个大型综合框架,它用于构建应用程序(app)而不是网页。 它开始学习YUI,也是采用面向对象的方法建立的。 它是大规模 JavaScript 应用程序的基准。

ExtJS更名为Sencha后,生产了一套完整的开发套件,涵盖JS框架(ExtJS)、测试工具(SenchaTest)、构建工具(SenchaCmd)、Java工具GXT、调试工具(SenchaInspector)、移动端(SenchaTouch) 、IDE 插头等

Ext.define用于在EXTJS中编写类,参数如下

类名 类名

会员

在ClassCreated上弹跳

该示例定义了一个 Person

与其他泛型类型不同,ExtJS 并不直接使用 new 来创建类的实例,而是使用 Ext.create 技术。 更多编写类的例子请参见官方文档()。

4、Mootools.js的类编写方法

Mootools.js 是一个简约、模块化、面向对象的 JavaScript 解释器。 它从Prototype.js中吸收了很多营养,有些句型是相似的。 它的命运与Prototype.js一样,随着jQuery的崛起而迅速衰落。

Mootools 使用类标识符编写类,类标识符本身就是一个类。

可以看到,和Prototype.js类似,有一个initialize,但是它可以正确维护创建对象的constructor属性。

接下来我会介绍两个用于编写类的小libjavascript取对象属性,它们都是专门用于以OOP形式编写类和组织代码的。

5.使用Klass.js编写类

Klass.js非常小,源代码不到100行。 作者是dustindiaz,他也是《ProJavaScriptDesignPatterns》和Ender.js 的作者。 事实上,他还编写了Promisewhen.js的实现。

使用 Klass 定义一个类

6.使用Class.js编写类

Klass的特点是链式调用,写起来很自然:先定义构造函数,然后添加类属性或方法,最后添加对象技术。

Class.js是我在学习JavaScript OOP编程时写的,源码不到300行。 支持编写类、私有属性/函数、继承、命名空间、事件等。实现了对象系统PME(属性-方法-事件)

) 框架。 对象有状态(Properties)、操作(Method)、通讯(Event)。

Class.js编写类示例

this.init 方法在这里至关重要。

四、ES6编写类

上一节介绍了各个解释器/框架的写法,风格各异。 它的本质仍然是构造函数+原型。 当语言本身不提供类似书写的句型时,程序员借助现有的机制来实现各种句型糖。

随着JavaScript应用的逐渐扩展,业务逻辑逐渐放在后端。 JavaScript 大型应用越来越多,传统的面向对象语言(如 Java 和 Ruby)也有成熟稳定的大型软件开发模型。 因此,在JavaScript中引入面向对象机制的需求日益迫切。

经过10年的讨论,20岁的JavaScript终于迎来了ES6。 其中就是类系统,包括关键字class、extends、super。 这标志着JavaScript开始迈入企业级小型应用开发语言的行列。

需要注意的是,ES6引入的类当然是句子糖。 继承方法内部仍然是原型方法,但是让我们用更简洁清晰的句子来创建对象并处理相关的继承。

ES6的写类定义了Person

看看继承

定义了一个类Person,构造函数就是构造函数,这一点和Java不同。 Java的构造函数名称与类名称相同。

上面的代码中,构造函数和toString方法中都出现了super关键字,它引用的是父类的实例(即父类的this对象)。 ES5之前,有一个Object.getPrototypeOf来获取父类的原型对象。