Является ли объект 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" в объекте.