Является ли объект JavaScript только ассоциативным массивом?

Хорошо, просто просматриваю основы JavaScript, и я изучал objects, где я столкнулся с этим примером...

JavaScript

var person = {
   firstname : "Smith",
   lastname  : "Bach"
};

И то, что мы пишем в PHP,

$person = array(
    "firstname"=>"Smith", 
    "lastname"=>"Bach"
);

Так это одно и то же, или я ошибаюсь в понимании концепции?

Ответы

Ответ 1

Нет, объекты больше.

Объект действительно является картой/словарем, но дополнительно каждый объект наследует некоторые из свойств (пары ключ-значение) от другого объекта. Этот другой объект называется прототипом.

Например:

var o = {
    x: 1
};

console.log(o.x === undefined);           // false, obviously
console.log(o.toString === undefined);    // false, inherited from prototype

Чаще всего прототип устанавливается путем создания объекта с помощью функции-конструктора:

var d = new Date();
console.log(d.hasOwnProperty('getYear'));     // false, it inherited

EDIT:

Здесь, как прототип работает с использованием конструкторских функций ( один способов выполнения ООП в JS):

// constructor function
// starts with capital letter, should be called with new
var Person = function (name, age) {
    // set properties of an instance
    this.name = name;
    this.age = age;
};

// functions to be inherited are in the prototype
Person.prototype.sayHello = function () {
    return this.name + ' is ' + this.age + ' old';
};

// new:
// - creates the object
// - sets up inheritance from prototype
// - sets the object as the context of the constructor function call (this)
var p = new Person('Jason', 27);

console.log(p.sayHello());

Ответ 2

Они являются ассоциативными массивами, но не только ассоциативными массивами. Существуют функции, доступные из прототипа Object (например, .toString()), имена которых могут сталкиваться с именами свойств. Объекты могут быть построены с помощью других функций и заданы еще более унаследованные свойства.

edit — я имею в виду следующее:

var o = {};
alert("toString" in o); // alerts "true"

Таким образом, у недавно созданного пустого объекта есть свойство, называемое "toString". Проблема с JavaScript заключается в том, что существует только один оператор доступа к объекту (ну два, но они два варианта одного и того же), поэтому нет возможности различать обращения к содержимому массива и доступ к API массива. (Кроме того, в JavaScript действительно не стоит думать о них, используя слово "массив", поскольку это означает что-то другое в JavaScript — массивы - это тип объекта со специальными свойствами.)

EcmaScript 5 имеет механизмы для определения свойств объекта таким образом, чтобы сделать их неизменными и неистребимыми, что помогает некоторым. Это все еще проблематично, если вы хотите сохранить свойство, называемое "toString" в объекте.