几乎Javascript中的所有内容都是一个对象?

时间:2012-02-02 08:05:31

标签: javascript oop

我在很多JavaScript介绍中都经常阅读这篇文章。我只是不明白。我总是将对象视为具有方法和属性的东西。 我理解的数组,因为它具有键值对。 “字符串”或“数字”或“功能”怎么样? 上面列出的这些东西对我来说似乎都很像。这意味着你输入一些东西,你会得到一些东西。你没有真正获得访问属性或任何东西。数组或“对象”列表中没有使用点符号。

是否有人使用点符号编写其中每个示例的一些示例,其方法和属性正在被访问?我怀疑对象的定义可能是有限的,因为我开始学习JavaScript ...

5 个答案:

答案 0 :(得分:151)

不,并非所有内容都是JavaScript中的对象。你经常与之交互的很多东西(字符串,数字,布尔)都是原始的,而不是对象。与对象不同,原始值是不可变的。这些原语确实有对象包装器(StringNumberBoolean),这种情况很复杂;这些对象具有方法和属性,而基元没有,但是基元似乎有方法,因为当代码试图访问基元的任何属性时,JavaScript会静默地创建包装器对象。

例如,请考虑以下代码:

var s = "foo";
var sub = s.substring(1, 2); // sub is now the string "o"

在幕后,s.substring(1, 2)的行为就像执行以下(近似)步骤一样:

  1. String创建包装器s对象,相当于使用new String(s)
  2. 使用步骤1返回的substring()对象上的相应参数调用String方法
  3. 处置String对象
  4. 从步骤2返回字符串(基元)。
  5. 这样做的结果是,虽然看起来好像你可以为基元分配属性,但它是没有意义的,因为你无法检索它们:

    var s = "foo";
    s.bar = "cheese";
    alert(s.bar); // undefined
    

    这是因为在String对象上有效地定义了属性,该对象立即被丢弃。

    数字和布尔也表现得这样。但是,函数是完全成熟的对象,并且继承自Object(实际上是Object.prototype,但这是另一个主题)。因此,函数可以执行任何对象,包括具有属性:

    function foo() {}
    foo.bar = "tea";
    alert(foo.bar); // tea
    

答案 1 :(得分:34)

这是正确的,在javascript中,几乎所有东西都是一个对象。但是这些对象与我们在Java,C ++或其他传统语言中看到的有点不同。 JS中的对象只是一个带键值对的散列映射。键总是一个字符串,值可以是任何东西,包括字符串,整数,布尔值,函数,其他对象等。所以我可以创建一个这样的新对象:

var obj = {}; // this is not the only way to create an object in JS

并在其中添加新的键值对:

obj['message'] = 'Hello'; // you can always attach new properties to an object externally

obj.message = 'Hello';

同样,如果我想为这个对象添加一个新函数:

obj['showMessage'] = function(){
    alert(this['message']);
}

obj.showMessage = function() {
    alert(this.message);
}

现在,每当我调用此函数时,它都会显示一条消息:

obj.showMessage();

数组就是那些能够包含值列表的对象:

var arr = [32, 33, 34, 35]; // one way of creating arrays in JS

虽然您始终可以使用任何对象来存储值,但是数组允许您存储它们而无需将键与每个对象相关联。因此,您可以使用它的索引访问项目:

alert(arr[1]); // this would show 33

数组对象就像JS中的任何其他对象一样,具有它的属性,例如:

alert(arr.length); // this would show 4

对于深入细节,我强烈推荐John Resig的Pro Javascript Techniques

答案 2 :(得分:9)

句子"在JavaScript中, ALMOST 一切都是对象"是正确的,因为 MAIN 代码单元(对象,函数,数组)是JavaScript对象。
JavaScript代码使用9个不同单位加1(多个):
- 01.阵列
- 02.布尔
- 03.功能
- 04. null
- 05.号码 - 06.对象
- 07. regexp
- 08.字符串
- 09. undefined
- 10.多个

但是 JavaScript对象:
- 与'对象'不同的生物。在其他面向对象语言中 - 它们是名称 - 价值对的集合 - 都具有创造功能(其构造函数) - 所有INHERIT构造函数的prototype-object的成员,这是它的原型 - 所有功能都是对象但并非所有对象都是功能 - 功能有范围,对象不是(我认为是设计缺陷) - 具有第一个CAPITAL的对象,函数,数组,字符串......是函数!!!
- JS对象和函数的差异比它的共性更重要 - 名称'实例'在JS中,名称'实例'具有不同的含义。在知识理论中,实例继承了其泛型概念的属性。在JS中只表示它的构造函数。 JavaScript得到了名称' instance'来自基于阶级的继承' ool(java),它是一个合适的名称,因为这些对象继承了类的属性 一个更好的JS关键字' instanceof'是' objectof'。

JS-functions ARE JS-objects 因为:
1)他们可以拥有JS-objects之类的成员:

    > function f(){}
    undefined
    > f.s = "a string"
    "a string"
    > f.s
    "a string"

2)他们有一个构造函数,就像所有JS对象一样,函数函数:

    > (function f(){}) instanceof Function
    true

3)作为所有JS对象,它们的prototype-object与其构造函数原型相同:

    > (function f(){}).__proto__ === Function.prototype
    true
    > ({}).__proto__ === Object.prototype
    true
    > (new Object).__proto__ === Object.prototype
    true
当然,作为SPECIFIC JS对象的JS函数具有额外的属性,就像编程语言中的所有函数一样,JS对象没有这些属性,您可以使用输入和输出信息调用(执行)它们。

一切不是一个对象,因为,例如,我们无法将成员添加到文字字符串中:

    > var s = "string"
    undefined
    > s.s2 = "s2string"
    "s2string"
    > s.s2
    undefined

答案 3 :(得分:5)

并非所有东西都是javaScript中的对象。 JavaScript具有基元和对象。 有六个原语 - null,undefined,string,number,boolean和symbol。 由于可以访问的属性和功能,似乎所有东西都充当了对象。例如 -

var stringvar="this string";
typeof stringvar; // "string"
stringvar.length; //11

现在是" stringvar"是一个字符串类型,它是一个基本类型,它不应该能够访问属性长度。它可以这样做,因为一些叫做Boxing.Boxing是任何基本类型转换为Object类型并且反向被调用的过程取消装箱。这些对象类型或对象包装器是通过以下视图创建的:人们可能需要使用原始值执行一些常见操作。它们包含有用的方法和属性,并且是原型链接到基元。 就对象而言,键值对可以添加到每个对象,甚至是数组。

var arr=[1,2,3];
arr.name="my array";
arr;  //[1,2,3,name:'my array']

这并不意味着数组的第四个元素是" name:' my array'"。" name"是一个可以用点表示法(arr.name)或括号表示法调用的属性(arr [" name"])。

答案 4 :(得分:0)

基于 developer.mozilla.org 和ECMAScript规范,答案是否定的。从技术上讲,并非所有事物都是对象。

https://developer.mozilla.org/en-US/docs/Glossary/Primitive

  

在JavaScript中,原语(原始值,原始数据类型)是不是对象且没有方法的数据。有7种原始数据类型:字符串,数字,bigint,布尔值,null,未定义,符号

原语不是对象,没有方法,它也是不可变的。除了null和undefined之外,所有其他原语周围都有一个wrap对象,为您提供一些可以使用的功能。例如,String用于字符串基元。

https://developer.mozilla.org/en-US/docs/Glossary/Primitive#Primitive_wrapper_objects_in_JavaScript

因此,在以下代码中,当您在原始数据toUpperCase()上调用name时,JavaScript将自动包装字符串基元并调用String对象的UpUpCase函数

var name = 'Tom';
console.log(name);

name.toUpperCase();
console.log(name); 
  

在要在原始字符串上调用方法或发生属性查找的情况下,JavaScript将自动包装字符串原始并调用该方法或执行属性查找。

还要注意,JavaScript区分String对象和原始字符串值。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#Distinction_between_string_primitives_and_String_objects

var nameP = 'Tom';
var nameO = new String(nameP);

typeof nameP // "string"
typeof nameO // "object"