ECMA-262 V7.0 中关于对象的概述

ECMA-262 V7.0 中关于对象的概述

译者目前在做前端,博客内容主要是文档翻译。如果读者希望我翻译某些和前端相关的文档,欢迎留言告诉我。对于已有在网络上能够搜到质量较高译文的文章,我就不做重复工作了。本人精力有限,翻译质量达不到出版书籍的程度,可能有些人看不懂,不过我相信这总会帮助到一些人。有空的时候我会返回来对之前的文章进行润色。

原文:http://www.ecma-international.org/ecma-262/7.0/#sec-objects

尽管ECMAScript包含了用于定义类的关键字,但ECMAScript并不像C++、SmallTalk和Java那样是从根本上基于类的。相应的,对象可以被通过多种方式创建包括:字面声明、构造函数(创建对象然后执行代码初始化对象的全部或部分属性)等。每个构造器都是一个含有叫做prototype的属性的函数。prototype用于实现原型继承和属性共享。对象通过在new表达式中使用构造函数被创建,例如:new Date(2009,11) 创建一个新的Date对象。调用构造函数而不使用new关键字的结果和构造函数本身有关。例如,Date()产生一个表示当前日期和时间的字符串而不是一个对象。

每一个被创建的对象有一个对其构造函数的prototype属性的隐式引用(叫做对象的原型)。此外,一个原型可能有一个对它原型的非null的隐式引用,并且持续下去。这被叫做原型链。当我们引用对象的一个属性时,会引用原型链中第一个拥有相同属性名字的对应属性。换句话说,首先检查当前对象是否有我们想要的属性;如果有则获取该属性的引用;如果没有则去这个对象的原型中查找,如此下去。
图1
图1
一般来说,在一个基于类的面向对象语言中,状态是由实例提供的,方法是由类提供的,继承仅仅对于结构和行为。在ECMAScript中,状态和方法是由对象提供的,结构、行为和状态都会被继承。

如果对象的原型共享了某一属性和它的值,那么这个对象不会直接包含这个属性。图1指出:

与大多数基于类的面向对象语言不同的是,属性可以通过赋值的方式被动态添加给对象。也就是说,构造函数不需要给被创建对象的所有属性命名或赋值。上图中,我们可以通过给原型CFp注册新值来为cf1、cf2、cf3、cf4和cf5共享属性。

尽管ECMAScript不是天生基于类的,但通过构造函数、原型对象和方法这种通用的模式来定义类似类的抽象概念通常是合适的。ECMAScript的内建对象自身遵守了这样一个类似类的模式。从ECMAScript 2015开始,ECMAScript包含了定义类的语法来让开发者通过和内置对象的类似类的抽象模式相一致的方式类定义对象。

我的看法:
1、ES并不直接支持类和它的概念但却提供了一个类似的概念: 先来看看ES与其他面向对象语言(C++,java,c#等)关于类概念的区别,有两点,如文中所说:1、其他面向对象语言中类的实例提供了状态(既属性),类提供了方法。我们对一个对象调用方法时是掉用类定义中的方法,将其运行上下文设置为当前对象。同一类的实例调用的是同一组方法(在概念上和实现上皆是如此)。也就是说实例(数据集)是分别存储的,方法存储在它的类定义里面。但在ES中对象(数据集)和方法都是存在实例中的。2、其他面向对象语言继承的是结构和行为,结构是指对象的内容如何解释,行为就是方法。一个类的实例在内存中具备一块完全的独立空间,这个空间中包含这个类及其所有祖先类的所有属性的存储空间。我们新建一个这个类的实例,他们互不干扰,从祖先类到子类所有数据属性都是独立的。在ES中不是这样,它继承的是状态、结构和方法。既数据、如何解释数据和方法。这意味着如果两个对象具有相同的原型对象,那么对原型对象的修改会同时影响到这两个对象。
所以我认为在ES中不存在类而仅仅存在对象,这不违背ES是面向对象的这一特点,面向对象不一定要有类。ES中继承的是对象而不是类,方法是属于对象的不是属于类的。ES中对象的继承是树形关系。在其他面向对象语言对象是独立的,类的继承是树形关系。
2、构造函数是对象的生成器而不是对象的类型:
文中指出构造函数用来初始化对象属性(也可以之后动态添加),构造函数的’prototype’会作为对象的原型。但不理解为对象的构造函数是它的类型,因为对象可以被动态修改属性,如果一个对象的构造函数是它的类型,当人们对它添加一个新的属性时它的类型是什么呢。

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在 Android 开发中,Fragment 是界面的一个模块化组件,可用于在 Activity 中灵活地添加、删除或替换。将 ListView 集成到 Fragment 中,能够实现数据的动态加载与列表形式展示,对于构建复杂且交互丰富的界面非常有帮助。本文将详细介绍如何在 Fragment 中使用 ListView。 首先,需要在 Fragment 的布局文件中添加 ListView 的 XML 定义。一个基本的 ListView 元素代码如下: 接着,创建适配器来填充 ListView 的数据。通常会使用 BaseAdapter 的子类,如 ArrayAdapter 或自定义适配器。例如,创建一个简单的 MyListAdapter,继承自 ArrayAdapter,并在构造函数中传入数据集: 在 Fragment 的 onCreateView 或 onActivityCreated 方法中,实例化 ListView 和适配器,并将适配器设置到 ListView 上: 为了提升用户体验,可以为 ListView 设置点击事件监听器: 性能优化也是关键。设置 ListView 的 android:cacheColorHint 属性可提升滚动流畅度。在 getView 方法中复用 convertView,可减少视图创建,提升性能。对于复杂需求,如异步加载数据,可使用 LoaderManager 和 CursorLoader,这能更好地管理数据加载,避免内存泄漏,支持数据变更时自动刷新。 总结来说,Fragment 中的 ListView 使用涉及布局设计、适配器创建与定制、数据绑定及事件监听。掌握这些步骤,可构建功能强大的应用。实际开发中,还需优化 ListView 性能,确保应用流畅运
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值