Как почти все в Javascript объект? - PullRequest
49 голосов
/ 02 февраля 2012

Я много читал об этом во многих введениях JavaScript.Я просто не понимаю этого.Я всегда думаю об объектах как о чем-то с методами и свойствами.Массивы я понимаю, так как он имеет пару ключ-значение.Как насчет «строк» ​​или «чисел» или «функций»?Эти вещи, перечисленные выше, кажутся мне функциями.Это означает, что вы что-то вводите, вы что-то получаете.Вы не можете получить доступ к свойствам или что-то еще.В массивах или этом списке «объектов» нет точечных обозначений.

Кто-нибудь кодирует некоторые примеры каждого из них с точечными обозначениями, к которым обращаются его методы и свойства?Я подозреваю, что определение объекта, вероятно, ограничено, так как я начал изучать JavaScript ...

Ответы [ 5 ]

154 голосов
/ 02 февраля 2012

Нет, не все является объектом в JavaScript.Многие вещи, с которыми вы регулярно общаетесь (строки, числа, логические значения), являются примитивами, а не объектами.В отличие от объектов, примитивные значения неизменны.Ситуация осложняется тем, что у этих примитивов есть обертки объектов (String, Number и Boolean);у этих объектов есть методы и свойства, в то время как у примитивов нет, но у примитивов, похоже, есть методы, потому что 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. Вызовите метод substring() с соответствующими параметрами для объекта String, возвращенного на шаге 1
  3. Утилизация объекта String
  4. Вернуть строку (примитив) из шага 2.

Следствием этого является то, что, хотя выглядит так, будто вы можете назначать свойства примитивам, это бессмысленно, поскольку вы не можете их получить:*

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

Это происходит потому, что свойство эффективно определено для объекта String, который немедленно отбрасывается.

Numbers and Booнаклоняется также вести себя так.Функции, однако, являются полноценными объектами и наследуются от Object (на самом деле Object.prototype, но это уже другая тема).Поэтому функции могут делать все, что могут объекты, включая свойства:

function foo() {}
foo.bar = "tea";
alert(foo.bar); // tea
35 голосов
/ 02 февраля 2012

Правильно, в 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

ДляЯ бы очень рекомендовал Pro Javascript Technique Джона Ресига .

9 голосов
/ 17 июля 2014

Предложение «В JavaScript ПОЧТИ все является объектом» является правильным, потому что MAIN кодовые единицы (объекты, функции, массивы) являются объектами JavaScript.
Код JavaScript использует 9 различных единиц плюс 1 (несколько):
- 01. массив
- 02. логическое значение
- 03. функция
- 04. ноль
- 05. номер
- 06. объект
- 07. регулярное выражение
- 08. строка
- 09. undefined
- 10. кратный

НО JavaScript-объекты:
- НЕ являются теми же существами, что и «объекты» в других объектно-ориентированных языках.
- они представляют собой набор пар имя-значение.
- у всех есть функция создания (ее конструктор).
- все наследуют члены объекта-прототипа его конструктора и это его прототип.
- все функции являются объектами НО НЕ все объекты являются функциями .
- функции имеют область действия, объекты НЕ (на мой взгляд, недостаток дизайна).
- Object, Function, Array, String, ... с первой заглавной буквы являются функциями !!!
- важнее различия между объектами и функциями JS, чем его общность.
- имя «экземпляр» в JS имеет другое значение с именем «экземпляр» в теории знаний, где экземпляр наследует атрибуты своей родовой концепции. В JS обозначает только его конструктор. JavaScript получил имя «instance» от «ool (java)» на основе класса-наследования, где это подходящее имя, потому что эти объекты наследуют атрибуты классов.
Лучшее имя для JS-ключевого слова instanceof - objectof.

JS-функции являются JS-объектами , потому что:
1) они могут иметь элементы, подобные JS-объектам:

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

2) они имеют функцию-конструктор, как и все JS-объекты, функцию Function:

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

3) как и у всех JS-объектов, их прототип-объект совпадает со своим прототипом конструктора:

    > (function f(){}).__proto__ === Function.prototype
    true
    > ({}).__proto__ === Object.prototype
    true
    > (new Object).__proto__ === Object.prototype
    true

4) конечно, JS-функции как СПЕЦИАЛЬНЫЕ JS-объекты имеют и дополнительные атрибуты, как и все функции в языках программирования, которых у JS-объектов нет, так как вы можете вызывать (выполнять) их с информацией ввода и вывода.

ВСЕ НЕ является объектом, потому что, например, мы НЕ можем добавлять члены в буквенную строку:

    > var s = "string"
    undefined
    > s.s2 = "s2string"
    "s2string"
    > s.s2
    undefined
5 голосов
/ 01 октября 2016

Не все является объектом в javaScript.У JavaScript есть примитивы и объекты.Существует шесть примитивов: null, undefined, string, number, boolean и symbol.Может показаться, что все действует как объект из-за свойств и функций, к которым можно получить доступ. Например, *

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

теперь, поскольку "stringvar" является строковым типом, который является примитивным типом, онне должен иметь доступа к длине свойства. Это может быть сделано из-за того, что называется Boxing.Boxing - это процесс, в котором любой примитивный тип преобразуется в тип Object, а обратный процесс называется Unboxing. Эти типы объектов или обертки объектов создаются с помощьюрассмотрим, что есть некоторые общие операции, которые могут потребоваться выполнить с примитивными значениями. Они содержат полезные методы и свойства и являются прототипами, связанными с примитивами.Что касается объектов, то пары ключ-значение могут быть добавлены к каждому объекту, даже к массивам.

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

это не означает, что четвертым элементом массива является «имя:» мой массив'"." name "- это свойство, которое можно вызывать с точечной нотацией (arr.name) или в скобках (arr [" name "]).

0 голосов
/ 11 июня 2019

На основании developer.mozilla.org , а также спецификации ECMAScript ответ - нет. Технически не все является объектом.

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

В JavaScript примитив (примитивное значение, тип примитива) - это данные, которые не являются объектом и не имеют методов. Существует 7 примитивных типов данных: строка, число, bigint, логическое значение, ноль, неопределенное, символ

Примитив не является объектом, не имеет методов и также является неизменным. За исключением null и undefined, все остальные примитивы имеют обертывающий объект, чтобы предоставить вам некоторые функции, которые вы можете использовать. Например String для строкового примитива.

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

Итак, в следующем коде при вызове toUpperCase() для примитивных данных name JavaScript автоматически обернет строковый примитив и вызовет функцию toUpperCase объекта String

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...