如何创建固定结构的对象?

2024-03-11

我的揭示模块中有以下代码,但我不确定如何声明/定义imageListItem,这严格来说是一个 DTO,并不真正需要任何信息隐藏。我是否正确定义了这个对象?

var imageListItem = function() {
    var _title;
    Object.defineProperty(this, "title", {
        get: function () { return _title; },
        set: function (value) { _title = value; }
        }
    );
};

var imageList = (function () {
    var buffer = new CBuffer();
    return {
        populate: function (listItems) {
            buffer.push(listItems);
        },
        rotate: function() {
             buffer.rotateLeft();
        }
    }
})();

With imageListItem,我想声明一个对象结构供以后使用。该声明在逻辑上不应依赖于该对象稍后将如何使用。也就是说,我不想发现自己动态分配新属性或从中删除属性,imageListItem意外地。对属性的任何分配都应该严格只针对已在对象上声明的属性。

Object.freeze() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze通过防止添加或删除属性几乎可以实现这一点,但它也可以防止更改属性。

例如。我要这个:

var obj = {
  prop: function() {},
  foo: 'bar'
};

// New properties may be added, existing properties may be changed or removed
obj.foo = 'baz';
obj.lumpy = 'woof';

var o = Object.freeze(obj);

// Now any changes will fail
function fail(){
  'use strict';
  obj.delete(foo); // throws a TypeError
  obj.quaxxor = 'the friendly duck'; // throws a TypeError
}

我不想要这个:

// Now any changes will fail
function fail(){
  'use strict';
  obj.foo = 'sparky'; // throws a TypeError
}

你看?我想freeze阻止quaxxor被添加到obj,但我不希望它阻止我改变的值foo.


您正在寻找的可能是Object.preventExtensions() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions or Object.seal() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal.

类似于Object.freeze(), 两种方法阻止将新属性添加到对象,但允许更改现有属性的值.

和...之间的不同seal and preventExtensions就是它seal严格禁止从数据访问器删除属性或将属性转换为数据访问器,而preventExtensions实际上并不会阻止现有属性被删除:此行为取决于您使用的 JS 引擎(某些引擎可能允许您删除该属性,其他引擎可能不允许)。

基本上,引用 MDN 文档:

The Object.preventExtensions()方法防止将新属性添加到对象中(即防止将来对该对象进行扩展)。 [...]请注意,不可扩展对象的属性通常仍然可以是deleted.

The Object.seal()方法密封一个对象,防止向其添加新属性并将所有现有属性标记为不可配置。只要当前属性可写,它们的值就仍然可以更改。 [...]尝试删除密封对象或向密封对象添加属性,或者将数据属性转换为访问器(反之亦然)将会失败.

下面是一个演示这两种方法的行为的示例:

var myFirstObj = { foo: 1 },
    mySecondObj = { bar: "baz" };

Object.preventExtensions(myFirstObj);
Object.seal(mySecondObj);

myFirstObj.foo = false; // Works fine
mySecondObj.baz = "hello"; // Works fine
delete myFirstObj.foo; // May work fine depending on your JS engine

(function() {
    'use strict';
    myFirstObj.qux = 'something'; // Throws a TypeError
    mySecondObj.qux = 'something'; // Throws a TypeError
    delete mySecondObj.foo; // Throws a TypeError
})();

现在,谈论你的ImageListItem对象,只需添加一行代码即可实现您想要的:

var ImageListItem = function() {
    var _title;
    Object.defineProperty(this, "title", {
        get: function () { return _title; },
        set: function (value) { _title = value; }
    });

    // Choose the one which fits your needs
    Object.preventExtensions(this);
    // or
    Object.seal(this);
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建固定结构的对象? 的相关文章

  • 主干关系事件未触发?

    class TheModel extends Backbone RelationalModel relations type Backbone HasMany key subModels relatedModel SubModel coll
  • 无法显示由 Fine-uploader 上传到 Amazon s3 的图像

    我现在尝试设置fineuploader s3以显示在aws服务器上成功上传的文件的图像 如示例页面上所做的那样 http fineuploader com s3 demo http fineuploader com s3 demo 我 仍然
  • 限制文本区域中每行的字符数

    我整个周末都在寻找解决这个难题的方法 但尚未找到一个可以正常工作的解决方案 我想要实现的是限制文本区域中每行的字符数 不是相同地限制它们 而是我选择的每行不同的字符数 例如 我只想在我的文本区域中包含 4 行 第 1 2 和 3 行将限制为
  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • 如何将中间件绑定到socket.io中的事件

    现在您可以将中间件绑定到io use middleware 但这仅在建立套接字连接时触发 有没有办法在将其传递给事件句柄之前拦截它 就像在expressjs中一样 换句话说 In 快递 js你可以做 app get middleware1
  • 如何通过 HTML 按钮播放声音

    我目前通过网站播放音乐的方法是通过 HTML 音频标签 不过我希望能够通过 HTML 按钮来播放它 该按钮应该能够在播放和停止之间切换音乐 我在 JSFiddle 创建了一个示例 但不知道如何实现它 有人可以告诉我如何使用我的 JSFidd
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 将 jquery-mobile 与 Webpack 结合使用

    我正在尝试使用 webpack 加载 jquery mobile 但到目前为止还没有运气 我知道 jquery mobile 依赖于 jquery ui 而 jquery ui 又依赖于 jquery 如何在 Webpack 中设置这样的场
  • 未捕获的引用错误:myFunction 未定义[重复]

    这个问题在这里已经有答案了 这到底是怎么回事 http jsfiddle net sVT54 http jsfiddle net sVT54
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • 使用 jquery 将字符串数组转换为整数

    我正在尝试将 jquery 中的字符串数组转换为整数数组 这是我的尝试 var cdata data values split each cdata function i l l parseInt l 我认为在这种情况下你不需要使用 Jqu
  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 是否可以使用打字稿映射类型来创建接口的非函数属性类型?

    所以我正在研究 Typescript 的映射类型 是否可以创建一个接口来包装另一种类型 从而从原始类型中删除函数 例如 interface Person name string age number speak void type Data
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • WebRTC:通道、轨道和流与 RTP SSRC 和 RTP 会话之间的关系

    来自 Mozilla 网站 https developer mozilla org en US docs Web API Media Streams API https developer mozilla org en US docs We
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一
  • 我可以使用 jQuery 动态创建文件(及其内容)吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这是我的 HTML 代码 ul li
  • 如何更改订阅值?使用 rxJS

    我正在创建一个计时器 需要你的帮助 我刚刚学习 Angular 和 rxJS 对此我有一些疑问 我正在创建一个具有启动 停止 暂停 重置功能的计时器 并且 btn Reset 必须将我的计时器 暂停 到 300 毫秒 怎么做 D 我的启动定

随机推荐

  • 恢复 C# Windows 窗体背景色

    我在 Windows 窗体窗体上有一个按钮 我将其背景颜色更改为Color Yellow当它被点击时 当再次单击它时 我想将其恢复为原始默认外观 默认背景色是SystemColor Control 当第一次单击按钮时 我唯一改变的是 btn
  • iOS 的标准语法解析器是什么?

    iPad 和 iPhone 的 iOS 支持解析器吗 特别是 lex yacc 或 flex bison 是否可用于 iOS 开发 xcode4 有原生支持的库吗 我可以通过 lex yacc 生成语法 然后获取 c 文件并将它们放入我的项
  • 在当前正在写入的文件上创建 FileInfo 是否安全?

    在我的应用程序 C 4 5 winforms 应用程序 中 我定期检查文件夹的内容并将找到的任何文件的详细信息存储到数据库中 在此例程中 我创建了一个FileInfo实例使用new FileInfo path 我读了属性CreationTi
  • 使用 Apache POI 读取 excel 文件

    我创建了这段代码来使用 Apache POI 读取 excel 文件的内容 我使用 eclipse 作为编辑器 但是当我运行代码时 我在粗体行中遇到了问题 有什么问题 excel的内容如下 Emp ID Name Salary 1 0 jo
  • Jenkins 与 Google Cloud 源存储库

    我正在尝试使用 Jenkins 进行 CI CD 我开发了一个Python Flask 应用程序 我正在将此应用程序部署到 Google App Engine 中 到目前为止我正在使用gcloud app deploy app yaml将应
  • 单击提交时验证文本区域

    我正在开发允许用户向系统发送反馈的网站 我使用文本区域和提交按钮创建了反馈表 最重要的是 当用户点击提交时 如果用户输入了一些我不希望他们输入的单词 该反馈将不会发送到系统 它会提醒用户在点击提交之前删除该单词 从现在开始 我只是创建一个简
  • 数据库中的最佳货币格式

    在我的数据库中与 ASP NET Web 应用程序结合使用的最佳货币格式是什么 我不确定浮点数和小数哪个更好 请注意 我不需要特定于文化的设置 如果您使用的是 SQL Server 则您拥有 money 类型 它会转换为 NET 中的十进制
  • 条件成员函数

    关于在 C 类中条件定义成员函数的建议是什么 问题集中在限制 DLL 中某些类的外部暴露 特别是当这些类作为参数传入时 显然这不是您想要对数据成员做的事情 但是函数应该没问题 不是吗 例如 class A public void func1
  • django 中的自定义 404 和 500 页面 -> DEBUG = True

    我想向客户展示我的网站示例 它还没有完全完成 但是对我来说隐藏错误并且不显示我的代码库非常重要 如果在开发模式下发生服务器错误 django 会执行哪些操作 就像这样 Django 描述出了什么问题 https i stack imgur
  • D3.js 中的日期格式

    我在 csv 中有一个列 日期 它将日期存储在 2003 02 01 年月日 中 我想将日期格式化为月份和年份 例如 2003 年 4 月 我该怎么做 var format d3 time format m Y data forEach f
  • 除了网站之外,还有 Webpack splitchunks.name 作为功能文档吗?

    随着 webpack 4 的引入 splitChunks name用于定义分割块的名称 在这里 文档说可以将键映射到自定义命名的函数 https webpack js org plugins split chunks plugin spli
  • C# 接口实现 - 为什么这不能构建?

    抱歉 如果之前有人问过这个问题 但实际上不可能用谷歌搜索 我认为 int 数组实现了 IEnumerable 因此 Thing 应该能够实现 IThing 怎么没有呢 public interface IThing IEnumerable
  • 普遍的 SQL 查询

    是否有人有一个查询来搜索 Pervasive 数据库中所有表中的所有列以获取特定值 我正在努力寻找有关此的任何信息 在 sql server 中似乎很容易做到 但在 Pervasive 中则不然 返回按表名排序的所有表的列表 按 xf na
  • IntelliJ IDEA 中的 JSP 调试

    有谁知道如何调试JSP in IntelliJ IDEA 当我在我的中设置断点时JSP文件中 这些断点似乎从未生效 调试器永远不会碰到它们 IDEA 似乎认为断点是有效的 我确实看到一个红点放置在我放置断点的行的左侧 我在 IntelliJ
  • Apache Thrift 中的对称加密 (AES)

    我有两个使用 Thrift 进行交互的应用程序 他们共享相同的密钥 我需要加密他们的消息 使用对称算法 例如 AES 是有意义的 但我还没有找到任何库来执行此操作 所以我做了一个研究并看到了以下选项 使用内置 SSL 支持 我可以使用内置的
  • 在 python 中查找并替换多个值

    我想查找一维数组 列表中的多个值并将其替换为新值 以列表为例 a 2 3 2 5 4 4 1 2 我想更换 val old 1 2 3 4 5 with val new 2 3 4 5 1 因此新数组是 a new 3 4 3 1 5 5
  • 覆盖 Eclipse 中的重命名操作

    I am new to eclipse plugin development I am in the need of overriding the rename dialog for the files in a specific cust
  • 管理二进制版本

    我正在寻找有关如何管理共同构成发行版本的二进制文件工件的工具和建议 该项目如下所示 Package Version Component A Version Component B Version Component C Version 可能
  • Laravel 4 - 验证器 - 文件大小

    只是询问有关 Laravels 验证器的问题 我网站的用户有时会上传大约 100MB 的文件 我看过 http laravel com docs 4 2 validation http laravel com docs 4 2 valida
  • 如何创建固定结构的对象?

    我的揭示模块中有以下代码 但我不确定如何声明 定义imageListItem 这严格来说是一个 DTO 并不真正需要任何信息隐藏 我是否正确定义了这个对象 var imageListItem function var title Objec