ES6 中引入了两个新的特性:Symbol 和 Proxy。它们分别提供了一种新的数据类型和一种对对象的拦截器,这些新特性为我们编写更加高效和安全的 JavaScript 应用程序提供了很多便利。
Symbol
Symbol 是一种新的基本数据类型,它用于表示独一无二的值。与字符串、数字和布尔值等基本数据类型不同,Symbol 值是唯一的,即使它们具有相同的描述符也是如此。Symbol 值通常用于对象属性的键,以确保这些键不会意外地与其他键冲突。
创建 Symbol
Symbol 可以使用全局的 Symbol 函数创建:
const sym = Symbol(); console.log(sym); // Symbol()
Symbol 可以使用一个字符串作为参数创建:
const sym1 = Symbol('foo'); const sym2 = Symbol('foo'); console.log(sym1 === sym2); // false
Symbol 作为对象属性键
Symbol 通常用作对象属性的键,以确保这些键不会与其他键冲突。使用 Symbol 作为属性键时,需要使用方括号语法:
const obj = {}; const sym = Symbol('foo'); obj[sym] = 'bar'; console.log(obj[sym]); // 'bar'
预定义的 Symbol
ES6 中预定义了一些 Symbol,它们具有特殊的用途:
Symbol.iterator
:用于定义对象的默认迭代器Symbol.toPrimitive
:用于定义对象的默认转换行为Symbol.toStringTag
:用于定义对象的默认字符串描述
例子
以下是一个使用 Symbol 作为对象属性键的例子:
// javascriptcn.com 代码示例 const name = Symbol('name'); const age = Symbol('age'); const person = { [name]: 'Alice', [age]: 30 }; console.log(person[name]); // 'Alice' console.log(person[age]); // 30
Proxy
Proxy 是一种对象拦截器,它可以拦截对象的操作并在这些操作执行前后执行一些自定义的逻辑。Proxy 可以用于实现各种功能,例如数据绑定、访问控制和缓存等。
创建 Proxy
使用 Proxy 可以对一个对象进行包装,以便在对该对象进行操作时执行一些自定义逻辑。以下是创建 Proxy 的基本语法:
const proxy = new Proxy(target, handler);
其中,target
是被包装的对象,handler
是一个对象,它定义了拦截器函数。以下是一个简单的例子:
// javascriptcn.com 代码示例 const target = { name: 'Alice' }; const handler = { get: function(target, prop) { console.log(`Getting ${prop}`); return target[prop]; } }; const proxy = new Proxy(target, handler); console.log(proxy.name); // 'Alice'
在上面的例子中,handler
对象定义了一个 get
函数,它拦截了对 proxy
对象的属性访问操作。当我们访问 proxy
对象的属性时,get
函数会被调用,并打印出一条日志。
拦截器函数
Proxy 支持多种拦截器函数,它们可以拦截对象的操作,例如访问属性、设置属性、调用函数和构造函数等。以下是一些常用的拦截器函数:
get
:拦截属性访问操作set
:拦截属性设置操作apply
:拦截函数调用操作construct
:拦截构造函数调用操作
例子
以下是一个使用 Proxy 实现数据绑定的例子:
<div id="app"> <p>{{name}}</p> <p>{{age}}</p> </div>
// javascriptcn.com 代码示例 const data = { name: 'Alice', age: 30 }; const handler = { get: function(target, prop) { console.log(`Getting ${prop}`); return target[prop]; }, set: function(target, prop, value) { console.log(`Setting ${prop} to ${value}`); target[prop] = value; updateView(); return true; } }; const proxy = new Proxy(data, handler); function updateView() { const app = document.getElementById('app'); app.innerHTML = ` <p>${proxy.name}</p> <p>${proxy.age}</p> `; } updateView(); setInterval(() => { proxy.age++; }, 1000);
在上面的例子中,我们使用 Proxy 包装了一个数据对象,并定义了一个 get
和一个 set
拦截器函数。当我们访问或设置数据对象的属性时,拦截器函数会被调用,并打印出一条日志。在 set
拦截器函数中,我们还调用了 updateView
函数,以更新 HTML 视图中的数据。最后,我们使用 setInterval
函数,以每秒钟递增 age
属性的值。由于我们使用了 Proxy,我们可以在数据对象的属性被访问或设置时执行一些自定义的逻辑,这让我们可以实现数据绑定等高级功能。
总结
ES6 中的 Symbol 和 Proxy 提供了一种新的数据类型和一种对对象的拦截器,它们为我们编写更加高效和安全的 JavaScript 应用程序提供了很多便利。Symbol 可以用于对象属性的键,以确保这些键不会意外地与其他键冲突。Proxy 可以用于实现各种功能,例如数据绑定、访问控制和缓存等。在使用 Symbol 和 Proxy 时,我们需要了解它们的特性和拦截器函数,并根据实际情况选择合适的用法。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657be8ebd2f5e1655d69ca53