JS 13 - Getter & Setter

大家好!

理解完物件继承的方法,就要接续介绍今天的 Getter 和 Setter 了。
我们进入今天的主题吧!


存取行为

出现赋值和取值的行为,就是存取行为。

let a;
a; // undefined
a = 'Felix'; // 'Felix'
a; // 'Felix'

/* or */

window.a; // undefined
window.a = 'Felix'; // 'Felix'
window.a; // 'Felix'

可赋值的情况下,新的值会是赋予的值,这是完全没有争议的,就像上方的举例一样。


存取器

Getter 和 Setter 顾名思义就是有 Get 和 Set 的行为,因此称呼为「存取器」是最适合的了。
那麽存取器究竟如何使用呢?让我们来看看:

document.cookie; // ''
document.cookie = 'name=Felix; max-age=9'; // 'name=Felix; max-age=9'
document.cookie; // 'name=Felix'
document.cookie = 'name=Felix; max-age=0'; // 'name=Felix; max-age=0'
document.cookie; // ''

document.cookie 赋值後,读取的值会和赋予的值不同,这就是存取器的特色之一。
document.cookie 乍看之下就是物件属性,但是为什麽又和一般的物件属性不同呢?
原因是因为 document.cookie 被充当函式使用了。


定义存取器

定义存取器和定义属性只有稍微不同,就是要在存取器的名称前加上 getset

let clicking = {
    limit: 10,
    targets: [],
    get status() {
        return this.targets;
    },
    set status(t) {
        if (this.targets.length < this.limit) return this.targets.push(t);
        throw new Error('You have reached the maximum set limit.');
    }
};

上方的存取器有什麽用途呢?让我们来看看:

window.addEventListener('click', function (e) {
    clicking.status = e.target;
    console.log('Clicked!');
});

/* 点击网页第 10 次 */
// Log: Clicked!
clicking.status; // [...×10]

/* 点击网页第 11 次 */
// Uncaught Error: You have reached the maximum set limit.
clicking.status; // [...×10]

网页被点击的前 10 次都会将点击到的元素推入 clicking.targets 阵列,并记录 Clicked! 於主控台。
但是,当点击次数超过 10 次时,就会跳出错误,并停止执行触发的函式,因此主控台不会有纪录。


有更能理解存取器的作用吗?

差不多也到尾声了,接下来我们要介绍的是物件的冻结、防止扩展和密封方式。
如果对文章有任何疑问,也欢迎在下方提问和建议!
我是 Felix,我们明天再见!


<<:  Day13 - 物理模拟篇 - 弹跳球世界IV - 成为Canvas Ninja ~ 理解2D渲染的精髓

>>:  整理6个媒体产业在机器学习应用的趋势

#6. Scroll Animation(原生JS版), #7. Progress Steps(原生JS版)

Scroll Animation 卡片滑动载入效果(原生JS版) CodePen: https://...

Day4 安装Vue

Vue的安装方式有很多种像我这次是使用CND的方式来使用Vue 首先呢我们可以先到Vue的网站 可以...

Day 25 : 插件篇 04 — 如何让 Obsidian 自动推荐关联笔记 (下)?介绍我的笔记架构与 Breadcrumbs 实战应用

介绍 这是 Obsidian 使用教学 — 应用篇的第 4 篇文章。 在 上一篇文章 中我介绍了 B...

Backtrader - 自订 datafeeds

我们之前在喂历史资料,都是先用 shioaji 下载下来,然後再用 padas 转成 datafra...

[DAY12] 在 Azure Machine Learning 里 Label data(上)

DAY12 在 Azure Machine Learning 里 Label data(上) Azu...