2012-02-02 4 views
34

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

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

+0

Вы изучили классический объектно-ориентированный (вид, где вы создаете классы и делаете из них множество экземпляров, например C++ или Java)? Это может помочь ответить на вопрос. – SoonDead

ответ

25

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

Хотя вы всегда можете использовать любой объект для хранения значений, но массивы позволяют yo u хранить их, не связывая ключ с каждым из них. Таким образом, вы можете доступ к элементу, используя его индекс:

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

Объект массива, так же, как и любой другой объект в JS, имеет его свойства, такие как:

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

Для деталей в глубину, я очень рекомендую John Resig Pro Javascript Techniques.

+0

+1 приятное описание! – Meysam

+4

Просто добавление, не относящееся к данной теме, свойство 'length' не возвращает количество элементов в массиве. Он возвращает 'lastIndex + 1' для этого массива. Например, в 'var x = []; x [100] = 5; alert (x.length) 'будет предупреждать' 101'. –

+16

Нет, не все в JavaScript является объектом. Строки, числа, булевы не являются, хотя у них есть объектные копии. –

121

Нет, не все объекты 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. Dispose из String объекта
  4. возвращают строку (примитивная), начиная с шага 2.

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

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

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

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

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

Этот ответ должен быть сверху: пока выбранный ответ достаточно хорош для практических целей, этот способ более тщательный (и интересный!) Спасибо! – theabraham

+7

Это правильный ответ. Не все - объект. Почти все является объектом. Посмотрите https://developer.mozilla.org/en-US/docs/JavaScript/A_re-introduction_to_JavaScript для типов в javascript. – Srinivas

+3

Хороший ответ. Интересно, что если вы используете 'var s = new String ('foo');', то 's.bar' будет хранить значение' cheese'. – Fenton

7

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

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

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

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

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

 
    > (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 
+2

Что много? Я не нахожу ссылки на многопользовательский тип googling. –

+0

«multiple» - это единица, которая может содержать различные типы, например переменную, в которой мы храним строку, число, массив, ... – synagonism

+0

Что вы подразумеваете под «единицей»? – Will

3

Не все является объектом в JavaScript. JavaScript имеет примитивы и объекты. Существует шесть примитивов: null, undefined, string, number, boolean и symbol. Казалось бы, как все действует в качестве объекта из-за свойств и функций, которые могут быть accessed.for ПРИМЕР-

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

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

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

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

Смежные вопросы