发布时间:2025-12-09 11:55:18 浏览次数:1
目录
一个完整的JavaScript实现应该由下列三个不同的部分组成:
ECMAScript和Web浏览器没有依赖关系,这门语言本身不包括输入和输出定义,我们常见的浏览器只是ECMAScript实现可能的宿主环境之一。
文档对象模型是针对XML但经过扩展用于HTML的应用程序编程接口。DOM把整个页面映射为一个多层节点结构。
从根本上讲,BOM只处理浏览器窗口和框架;但人们习惯上也把所有针对浏览器的JavaScript扩展算作BOM的一部分,例如:
navigator对象;location对象;screen对象;XMLHttpRequst和IE的ActiveXObject这样的自定义对象。略
ECMAScript的语法大量借鉴了C以及其他类C语言,例如Java和Perl的语法。
ECMAScript中的一切(变量、函数名和操作符)都区分大小写。
面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。(ES6之后,这种情况改变了,具体可以参照《阮一峰-ES基础入门》。
ECMA-262把对象定义为:“无序属性的集合,其属性可以包括基本值、对象或者函数”。
我们可以把ECMAScirpt的对象想象成散列表:无非就是一组名值队,其中值可以是数据或函数。每个对象都是基于一个引用类型创建的,这个引用类型可以是第5章中讨论的原生类型,也可以是开发人员定义的类型。
创建自定义对象,可以:
Object的实例,然后再为它添加属性和方法;ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征。这些特性是为了实现JS引擎用的,因此在JS中不能直接访问它们。为了表示特性是内部值,该规范把它们放在了两对方括号中。
ECMAScript中有两种属性:数据属性和访问器属性:
[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,对于直接在对象上定义的属性,默认为true。[[Enumerable]]:表示能否通过for-in循环返回属性,对于直接在对象上定义的属性,默认为true。[[Writable]]:表示是否能够修改属性的值,对于直接在对象上定义的属性,默认为true。[[Value]]:包含这个属性的数据值,默认为undefined。[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性,对于直接在对象上定义的属性,默认为true。[[Enumerable]]:表示能否通过for-in循环返回属性,对于直接在对象上定义的属性,默认为true。[[Get]]:在读取属性时调用的函数,默认为undefined。[[Set]]:在写入属性时调用的函数,默认为undefined。非常重要:
要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法。这个方法接受三个参数:属性所在的对象、属性的名字和一个描述符对象,Vue2.x中双向绑定的一个过程类似:
var Book = {}var name = '';Object.defineProperty(Book, 'name', { set: function (value) { name = value; console.log('你取了一个书名叫做' + value); }, get: function () { return '《' + name + '》' }}) Book.name = 'vue权威指南'; // 你取了一个书名叫做vue权威指南console.log(Book.name); // 《vue权威指南》