JavaScript Object只是一个关联数组吗?

时间:2012-12-25 14:12:30

标签: javascript

好的,我正在浏览JavaScript的基础知识,我正在学习objects,我遇到了这个例子......

的JavaScript

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

我们用PHP编写的是

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

这是同样的事情,还是在理解这个概念时犯了错误?

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:1)

它们是关联数组,但不是 关联数组。 Object原型中有一些函数(如.toString()),其名称可能与属性名称冲突。对象可以通过其他函数构造,也可以提供更多的继承属性。

编辑 - 我的意思是:

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

因此,新创建的空对象似乎具有名为“toString”的属性。 JavaScript的问题在于,只有一个属性访问器运算符(两个,但它们是同一个东西的两种),因此无法区分对数组内容的访问和对数组API的访问。 (另外,在JavaScript中,使用“数组”这个词来思考它们确实不是一个好主意,因为这意味着JavaScript中存在不同的东西 - 数组是一种具有特殊属性的Object。)

EcmaScript 5具有以这样的方式定义对象属性的机制,即使它们不可变且不可迭代,这有助于某些。如果要在对象中存储名为“toString”的属性,则仍然存在问题。