JavaScript对象只是一个关联数组吗?

10

我正在学习 JavaScript 的基础知识,其中涉及到 对象,我看到了这个例子...

JavaScript

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

我们在PHP中编写的内容是

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

那么这是同一件事情,还是我的理解有误?


2
FYI,PHP的array(数组和哈希映射混合在一个数据结构中)是一个糟糕而混乱的概念。你应该询问“它如何工作”,而不是“它与PHP中的xyz类似”。 ;) - duri
2个回答

11

不,对象不仅仅是那样。

对象确实是一张地图/字典,但另外每个对象都会从另一个对象继承一些属性(键-值对)。那个其他的对象被称为原型。

例如:

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's inherited

编辑:

这是使用构造函数制作原型的工作方式(这是JS中实现OOP的一种方式):

// 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());

我不想在这里写一本关于原型的书。我正在为那些已经了解一些编程知识的人制作JS课程,如果你有兴趣,请告诉我。 - Stefan
@Mr.Alien 那我推荐一本《JavaScript Patterns》的书,非常值得一读。如果你需要更多的话,可以试试《JavaScript权威指南》。 - Stefan

2
它们是关联数组,但不仅仅是关联数组。可以从Object原型中使用函数(如.toString()),其名称可能与属性名称冲突。对象可以通过其他函数构造并赋予更多继承的属性。 (请注意,普通对象没有像数组对象一样的.length属性来计算条目数。JavaScript对象可能不是最好用“关联数组”这个术语来描述;它们是对象,在熟悉JavaScript后应该足够了。)
var o = {};
alert("toString" in o); // alerts "true"

因此,一个新创建的空对象似乎有一个名为“toString”的属性。JavaScript的问题在于只有一种属性访问操作符(实际上有两种,但它们是同一种东西的两种不同类型),因此无法区分对数组内容和对数组API的访问。(此外,在JavaScript中,使用单词“array”来考虑它们真的不是一个好主意,因为在JavaScript中它意味着不同的东西——数组是具有特殊属性的对象类型。)

ECMAScript 5具有定义对象属性的机制,使其成为不可变且不可迭代的,这有助于某些情况。但如果您想在对象中存储一个名为“toString”的属性,则仍然存在问题。


你能给我展示一个例子吗?如果可以的话,能和 PHP 进行比较吗?如果你不熟悉 PHP,只用 JS 也可以。 - Mr. Alien
@Mr.Alien 好的,我会稍微扩展一下答案。 - Pointy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接