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

Is JavaScript Object nothing but an associative array?

本文关键字:关联 一个 数组 Object JavaScript      更新时间:2023-09-26

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

JavaScript

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

PHP中写的是

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

所以这是一回事还是我在理解概念上犯了错误?

不,对象不止于此。

Object确实是一个映射/字典,但另外每个对象从另一个对象继承一些属性(键值对)。另一个对象叫做prototype。

例如:

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

它们是关联数组,但不是只是关联数组。Object原型中有一些函数(如.toString()),其名称可能与属性名称冲突。对象可以通过其他函数构造,也可以被赋予更多的继承属性。(请注意,普通对象不具有的一件事是用于计数条目的.length属性,就像数组对象一样。术语"关联数组";可能不是JavaScript对象的最佳选择;它们是对象,一旦你熟悉了JavaScript,这就足够了。)

edit -我的意思是:

var o = {};
alert("toString" in o); // alerts "true"
因此,新创建的空对象似乎有一个名为"tostring"的属性。JavaScript的问题是只有一个属性访问操作符(两个,但它们是同一事物的两种风格),因此无法区分对数组内容的访问和对数组API的访问。(另外,在JavaScript中使用"array"这个词并不是一个好主意,因为这在JavaScript中意味着一些不同的东西——数组是一种具有特殊属性的对象类型。)

EcmaScript 5有一些机制来定义对象属性,使它们不可变且不可迭代,这对一些有帮助。如果你想存储一个名为tostring的属性还是有问题的