为什么/如何在JavaScript中使用对象?

为什么/如何在JavaScript中使用对象?,javascript,programming-languages,Javascript,Programming Languages,我知道如何实例化对象并调用它们,但我就是找不到在脚本中使用它们的理由。我可以 var obj = { hi: function() { return "Hello"; } }; 但为什么我不能像这样做: function hi() { return "Hello"; } 我从来都不明白为什么我应该使用原型。我在JavaScript中所做的大多数事情都可以在没有对象的情况下做得很好。但我想使用对象。对象的用途是什么?我应该使用它们的原因是什么?它试图模

我知道如何实例化对象并调用它们,但我就是找不到在脚本中使用它们的理由。我可以

var obj = {
    hi: function() {
        return "Hello";
    }
}; 
但为什么我不能像这样做:

function hi() {
    return "Hello";
}

我从来都不明白为什么我应该使用原型。我在JavaScript中所做的大多数事情都可以在没有对象的情况下做得很好。但我想使用对象。对象的用途是什么?我应该使用它们的原因是什么?

它试图模拟OOP范例,仅此而已。有多种方法可以做到这一点。但是问问你自己,“hi”是属于“obj”还是它是一个独立的函数?这一切都是关于功能与对象的密切关系。函数是否需要访问对象私有变量等?

对象很有用,因为

  • 它们是有状态的
  • 它们可以存储字符串和数据之间的关系
  • 通过将问题分解为收集相关操作和状态的对象,可以更容易地分解问题

  • 如果您不需要非全局状态,不需要查找表,并且您的问题很小或更容易从功能上分解,那么就不要使用对象。

    如果没有您所指的对象,您将到处都是松散的函数。这通常会导致代码很难维护。基本上,对象使您能够将函数组合在一起以模拟名称空间——这是最低限度的

    在您的简单示例中,编写一个半“class”/object来保存该方法确实毫无意义。但是当你的代码增长时,你会得到越来越多的函数和方法,你真的不想把它们都放在一个大的(全局)命名空间中。这是不可能维护的,没有人会理解代码,包括你以后的代码


    这是将方法封装在对象/“类”中的第一个好理由。另一个很好的原因是重复使用。如果您正在写入能够继承其方法的对象,则可以重新创建另一个对象,并从中提取它。最简单的概念,但如果要将应用程序中的“事物”描述为模块/对象,则需要使用它。

    对象非常有用,例如,可以将属于一起的值组成一个单位。例如:

    function Person(firstName, lastName, gender, age) {
      this.firstName = firstName;
      this.lastName = lastName;
      this.gender = gender;
      this.age = age;
    }
    
    Person.prototype = {
      getFullName: function() { return this.firstName + ' ' + this.lastName; },
      isMale: function() { return this.gender == 'Male'; },
      isFemale: function() { return this.gender == 'Female'; }
    };
    
    var amanda = new Person('Amanda', 'Smith', "Female", 42);
    var john = new Person('John', 'Doe', 'Male', 72);
    
    alert(amanda.getFullName());
    alert(john.isMale());
    
    与结构化程度较低的公司相比:

    function getFullName(firstName, lastName) {
      return firstName + ' ' + lastName;
    }
    
    function isMale(gender) {
      return gender == 'Male';
    }
    
    function isFemale(gender) {
      return gender == 'Female';
    }
    
    var amandaFirstName = 'Amanda';
    var amandaLastName = 'Smith';
    var amandaGender = 'Female';
    var amandaAge = 42;
    var johnFirstName = 'John';
    var johnLastName = 'Doe';
    var johnGender = 'Male';
    var johnAge = 72;
    
    alert(getFullName(amandaFirstName, amandaLastName));
    alert(isMale(johnGender));
    
    这不是一个“Javascript中的对象”,而是一个“一般的对象”问题

    我想说最相关的Javascript—Javascript唯一与对象相关的地方是它们在命名空间时的整洁使用。例如,大多数Javascript库将所有内容打包在一个对象中以避免命名空间冲突:

    dojo.create( ... )
    dojo.connect( ... )
    
    至于为什么使用OOP的其他问题,我认为OOP擅长两个基本方面(通用、愚蠢,下面是示例):

  • 动态调度-摆脱“如果”,将责任放在它所属的地方

    当您看到一个有大量“开关”的代码时:

    最好将每种不同的行为捆绑到不同类型的对象中,并使用动态调度:

    function doStuff(animal):
       animal.print_speak();
       animal.print_food_type();
    
    现在,如果你将来想得到另一种动物,你不需要到处寻找你的代码来添加它-你所需要做的就是用适当的print_speack和print_food类型方法创建一个新类,其余的代码不会注意到任何事情

  • 继承+重用方法

    在普通的OO语言中,每个对象存储(并花费内存)其实例变量,而所有方法+静态变量都由类存储在一个地方。Javascript没有类,但它有原型,它们最终提供相同的基本功能


  • 关于“为什么”部分的一些一般想法:


    对象的存在是为了交流。它是项目中每个人的常用词汇。人们习惯于使用事物(对象)及其操作(消息或方法),而不仅仅是不连续的操作(功能).

    函数实际上是一个对象,所以即使你不知道它,你也在使用它们。不幸的是,函数是JS中的对象,一切都是如此,所以如果你不想在JS中使用对象,就不要使用JS:你为什么要显式定义对象?我明白你的意思。对象提供组织。对吗?@David:对象的优点一个代码本身并不提供组织,但它们是组织信息的一种非常有用的方式它可以被封装并表示为整个对象,而不仅仅是一小部分数据元素,这样组织它们是有意义的。请注意,这适用于支持这种数据结构的任何语言,不仅仅是JavaScript。回答得很好,但我认为可以将
    isMale
    isFemale
    组合起来不那么令人困惑:)
    function doStuff(animal):
       animal.print_speak();
       animal.print_food_type();