当前位置: 首页 > 知识库问答 >
问题:

在JavaScript中,这些不同的对象创建方法的正确应用是什么

洪彬
2023-03-14

我更喜欢后端而不是前端,但是JavaScript引起了我的兴趣。我试图把我的头围绕在我看来是多种不同的建模对象的方法上。

在过去的几年里,我主要是在编写与此类似的代码(假设jQuery已加载):

var TicketForm = {

    elements: ['input', 'textarea', 'select', 'checkbox'],

    enable: function(form) {
        this.elements.forEach( function(el) {
            form.find(el).prop('disabled', false);
        });
    },

    disable: function(form) {
        this.element.forEach( function(el) {
            form.find(el).prop('disabled', true);
        });
    }
};

这样我就可以简单地调用TicketForm。启用($(“#无论什么”)来启用特定的表单,非常类似于PHP中的静态方法调用。

我最近一直在PHP中使用闭包,我知道它们在JavaScript中也存在(我正在使用它们)。我试图更彻底地理解这个概念。在遇到这个惊人的脚本:http://codepen.io/stuffit/pen/KrAwx后,我决定努力模仿作者的编码风格。只是试图复制他的风格,我重写了我的代码如下:

var TicketForm = function() {
    this.elements = ['input', 'textarea', 'select', 'checkbox'];
};

TicketForm.prototype.enable = function(form) {
    this.elements.forEach( function(el) {
        form.find(el).prop('disabled', false);
    });
};

TicketForm.prototype.disable = function(form) {
    this.elements.forEach( function(el) {
        form.find(el).prop('disabled', true);
    });
};

但是,当我调用TicketForm时。启用($(“#无论什么”) 在这种情况下,我得到了错误

Uncaught TypeError: Object function () {
    this.elements = ['input', 'textarea', 'select', 'checkbox'];
} has no method 'enable'

所以我在SO上做了一点研究,发现JavaScript是如何工作的。原型?。第二个答案特别有启发性,因为我来自类概念背景,而不是原型概念背景。我还翻了几张幻灯片:http://ejohn.org/apps/learn/#65,这也很有帮助。事实证明,我所要做的就是创建一个TicketForm实例,此时它的方法对我来说是可用的:

var myForm = new TicketForm();
myForm.enable(form); // works as expected

我有三个问题:

  1. 为什么除了个人编码风格之外,人们会选择上面的任何一种方法而不是另一种方法?
  2. 为什么我必须用第二种方法声明对象的实例,而不是用第一种方法?
  3. 这些编码样式中的任何一种都有专有名称吗?

共有3个答案

墨星鹏
2023-03-14

第一个方法是一个“literal对象”,非常像一个静态类,“this”指的是父对象“TicketForm”,您可以像“self”一样理解它。在第二种方法中,“this”指的是窗口,它不是oo,除非您:

var myForm = new TicketForm();

这里"this"指的是myForm实例。此方法是构造函数方法(TicketForm是构造函数)

闻人浩波
2023-03-14

在JavaScript中,默认情况下对象是可变的。这意味着,除非您使用的是现代JavaScript引擎,并且有人故意阻止修改对象,否则您始终可以添加、删除和修改对象中的属性。

在第一种情况下,您使用的是简化对象创建的特殊语法。{}语法创建了一个简单的对象,它只不过是对象的一个实例。这与JS中对象的易变性相结合,意味着以下html" target="_blank">代码段都是等效的:

var TicketForm = {
  elements: ['input', 'textarea', 'select', 'checkbox']
};

var TicketForm = {};
TicketForm.elements = ['input', 'textarea', 'select', 'checkbox'];

var TicketForm = new Object();
TicketForm.elements = ['input', 'textarea', 'select', 'checkbox'];

本质上,使用{}类似于在经典OOP语言中创建对象的实例,而创建构造函数类似于使用类。在构造函数及其原型中,您定义了该构造函数的所有实例(共享该原型的所有对象)将采用的蓝图。

所以这不是关于风格,而是关于你需要创造什么。如果需要同一事物的多个副本,则使用构造函数。如果您只需要一个,只需创建一个简单的对象,无需遵循礼节,创建一个单件并以一式三份的形式签署所有内容;)

龙星渊
2023-03-14

第一个方法定义一个对象文本,基本上创建一个“单例”。如果需要同一“类”的多个实例,则需要一个构造函数(或Object.create)。

 类似资料:
  • 我想知道在静态编程语言中创建全局常量的最佳方法是什么。Java,我们将使用一个包含常量的类,我们只需要导入这个类就可以访问所有常量。但是在静态编程语言中,有两种主要的方法: > 您可以创建一个包含所有常量的对象: 对象常量{const valCONST_1="foo"const valCONST_2="bar"const valCONST_3="toto"} 但这不是推荐的方式,正如一位语言开发者

  • 我是一个项目的一部分,我正在尝试添加TypeScript Web Server,这将与Swagger兼容。 什么是最基本的策略来实现它,考虑到容易的可运维性。 > 对于TypeScript,我注意到存在用于从TypeScript接口生成JSON模型的Tyson库。 对于Swagger,我尝试使用“Swagger node restify”库,因为它支持向Swagger添加JSON模型。 然而,我遇

  • 问题内容: 我正在尝试从PHP数组创建JSON对象。该数组如下所示: 编码JSON的代码如下所示: 最后,JSON文件应该看起来像这样: 如何将创建的JSON代码封装在“项目”中:{JSON CODE HERE}。 问题答案: 通常,您将执行以下操作: 但是,似乎您希望输出与“ ”一起使用,因此最好确保通过传递常量来强制将其编码为对象。 “ ”括号指定一个对象,“ ”用于根据JSON规范的数组。

  • 以下代码展示了JavaScript : 加起来一个总和 构建数组 构建一个脚本对象 如何理解第三个例子中大括号周围增加的括号?它们只是为了不让对象括号被解释为函数括号吗?还是他们有其他目的? 是否有其他方法来编写第三个示例,以使该语法更加明确,例如,是否可以在多行函数中构建JavaScript对象?

  • 我是第一次在学校项目中使用JavaFX,所以很可能我做了一些明显错误的事情。 在我的controller类中,我有一个方法(customerSU),它创建了一个新的Customer和Cleast对象,我使用这些新的Customer和Cleast对象的其他方法有一个错误“无法解析符号”Cust1“。 谢谢你的帮助!

  • 本文向大家介绍在JavaScript中正确引用bind方法的应用,包括了在JavaScript中正确引用bind方法的应用的使用技巧和注意事项,需要的朋友参考一下  在JavaScript中,方法往往涉及到上下文,也就是this,因此往往不能直接引用,就拿最常见的console.log("info…")来说,避免书写冗长的console,直接用log("info…")代替,不假思索的会想到如下语法