【问题标题】:What exactly is an object? [JavaScript]究竟什么是对象? [JavaScript]
【发布时间】:2019-04-23 22:16:39
【问题描述】:

我在 MDN 上了解到对象是具有属性和方法的东西,并且 JavaScript 中的大部分内容都是/可以被视为对象。上一句中提到的所有内容都让人很难分辨出一个对象是什么。一些文章说对象只是数据容器,另一些文章说对象是关于你想在代码中使用的东西的整洁的信息包。只有对象:数组、对象字面量和函数吗?

let objectLiteral = {

} ;


let exFunction = () = > {

}


let arr = [

] ;

【问题讨论】:

  • 是的,JavaScript 中几乎所有的值都是对象。是的,对象可以是数据容器。是的,对象可以是整齐的信息包。数组是一种特殊的对象,可以使用[...] 语法进行初始化。函数是一种特殊的对象,可以用fn() 语法调用,也可以用它们自己的特殊语法声明。像undefined 这样的特殊情况不是对象、数组或函数

标签: javascript function object ecmascript-6


【解决方案1】:

对象是一种复杂的数据类型,它存储值并允许使用特定键访问它们。对象内部的键/值组合称为属性。

JavaScript 是一种面向对象的编程语言。这意味着几乎每个值都是一个对象。某些类型的值被称为 primitives,它们被视为“基础”,作为简单的数据类型。这些原语是字符串、数字、布尔值、nullundefined
(请注意,除了布尔值、nullundefined,所有原语也是秘密对象,因为只有对象可以有方法——你有String.splitNumber.toString等)

还有很多其他的数据类型,它们是一种特定的对象:

  • 数组以索引方式存储值,并保证顺序(与对象不同)
  • 函数接收值、执行代码并可能返回一个值以供以后使用
  • 集合类似于数组,但只存储唯一值

然而,许多人在想到“对象”时会想到对象字面量。它看起来像这样:

const myObject = {
  name: "Jack",
  cool: false,
  friends: 0
  pets: ["Dog", "Cat", "Snake"]
};

您可以看到对象属性的格式为key: value,如果属性更多,则在后面加上逗号,(在ES6中,允许使用逗号结尾)。

对象也可以包含方法

const myObject = {
  name: "Jack",
  sayHello: function() {
    console.log(`Hello, my name is ${this.name}!`);
  }
};

注意:当在对象中创建方法时,最高层的函数(在本例中为sayHello之后的部分),必须是一个ES5-样式函数,以便对this 的引用正常运行。如果嵌套函数(如 setTimeout)也需要引用对象,则它们必须是 ES6 风格的函数,因为箭头函数(=>)不带有自己的 this 绑定。

对象也可以使用构造函数 (ES5) 或类 (ES6) 来构造。

构造函数必须是 ES5 函数,并且在其中分配所有属性(通常来自传递的参数):

function MyObject(name, cool) {
  this.name = name;
  this.cool = cool;
}

var jack = new MyObject("Jack", false);
var bob = new MyObject("Bob", true);

console.log(jack);
console.log(bob);
.as-console-wrapper { max-height: 100% !important; top: auto; }

要将方法附加到新对象,您可以将它们附加到构造函数的prototype

function MyObject(name, cool) {
  this.name = name;
  this.cool = cool;
}

MyObject.prototype.sayHello = function() {
  console.log(`Hello, I am ${this.name}`);
};

var jack = new MyObject("Jack", false);
var bob = new MyObject("Bob", true);

jack.sayHello();
bob.sayHello();

ES6 类是对构造函数的重新设计。您有一个 constructor 函数,您可以在其中定义所有属性,并将所有其他方法放在同一个位置。这是我们的 MyObject 构造函数转换为 ES6 类:

class MyObject {
  constructor(name, cool) {
    this.name = name;
    this.cool = cool;
  }
  sayHello() {
    console.log(`Hello, I am ${this.name}`);
  }
}

let jack = new MyObject("Jack", false);
let bob = new MyObject("Bob", true);

jack.sayHello();
bob.sayHello();

您还可以将对象放入其他数据容器中 - 例如对象和数组。如果你把一个对象放在一个对象里面,你就有一个嵌套对象

const parent = {
  nested: {
    value: "I am nested"
  }
};

console.log(parent.nested.value);

正如您在上面看到的,您可以使用点表示法访问对象的不同属性和方法。但是如果你有一个想要获取的属性,但是属性名存储在一个变量中呢?您需要使用动态属性表示法,也称为方括号表示法(因为它涉及方括号[]):

const obj = {
  aReallyObscureKey: "Hello!"
};

const key = "aReallyObscureKey";

console.log(obj[key]);

数组也可以保存对象:

const arrayOfObjects = [{
  name: "Jack",
  cool: false
}, {
  name: "Bob",
  cool: true
}];

console.log(arrayOfObjects);
.as-console-wrapper { max-height: 100% !important; top: auto; }

希望这会有所帮助。以下是一些链接,可帮助您了解有关对象的更多信息:

【讨论】:

  • 哇!谢谢你这么棒的解释!
【解决方案2】:

当您想要拥有多种类型的东西时,对象很有用。 例如,如果您想了解某个人或联系人的一些信息; 如果没有对象,您需要将信息存储为:

const name = 'John';
const age = 32;
const lastName = 'John Doe'
const zips = [1, 2, 3, 4]

但是,对象可以让您在单一类型中拥有所有这些属性 例如:

const person = {
  name: 'John',
  age: 32,
  lastName: 'Doe'
  zips : [1, 2, 3, 4]
};

console.log(person.name) 

对象可以存储任何东西,任何类型。我希望这有帮助。

【讨论】:

    【解决方案3】:

    JavaScript 对象是一个名称:值对。当您的 Web 浏览器与 Web 服务器通信时,两者很可能使用 JSON(JavaScript Object Notation)通过 HTTP 进行通信

    假设您正在查看您的 facebook 个人资料,当您单击个人资料详细信息时,您请求一个页面,facebook 服务器将为您提供一个可能如下所示的对象:

    
    {
      name: "iamlearningtocode"
      occupation: "student programmer"
      hobbies: "programming"
    }
    

    然后通过 JavaScript 的强大功能,运行代码,获取该信息并以整洁的顺序将其显示在页面上。希望这是有道理的!

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 2011-05-18
      • 2014-10-28
      • 2012-08-27
      • 2010-11-12
      相关资源
      最近更新 更多