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

Posted

技术标签:

【中文标题】JavaScript Object 只是一个关联数组吗?【英文标题】:Is JavaScript Object nothing but an associative array? 【发布时间】:2012-12-11 11:13:05 【问题描述】:

好吧,我只是在学习 javascript 的基础知识,我正在学习 objects,我在哪里遇到了这个例子......

JavaScript

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

而我们用 php 写的是

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

所以这是同一件事还是在理解这个概念时犯了错误?

【问题讨论】:

仅供参考,PHP 的 array(数组和哈希图混合在一个数据结构中)是一个糟糕且混乱的概念。你应该问“它是如何工作的”而不是“这与 PHP 中的 xyz 有什么相似之处”;) 【参考方案1】:

不,对象不止于此。

Object 确实是一个映射/字典,但另外每个对象都从另一个对象继承了一些属性(键值对)。另一个对象称为原型。

例如:

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 课程,所以如果你有兴趣,请告诉我。 我现在真的需要OOP了..顺便说一句,你的答案更清楚了,等一下,等我接受,我会奖励你+1,清除它在一定程度上:) @Mr.Alien 那么我会推荐“JavaScript 模式”一书。这是一个很好的阅读。如果您需要更多,请尝试 JavaScript:权威指南”。【参考方案2】:

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

编辑——我的意思是:

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

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

EcmaScript 5 具有定义对象属性的机制,以使它们不可变和不可迭代,这有助于一些。如果你想在一个对象中存储一个名为“toString”的属性,这仍然是个问题。

【讨论】:

你能给我举个例子吗?如果可以和PHP比较?或者如果你不熟悉 PHP,只需要 JS 就可以了 @Mr.Alien 好的,我会稍微扩展一下答案。 谢谢你的详细解释+1 :)

以上是关于JavaScript Object 只是一个关联数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

mysq数据库再次理解

JavaScript中object的属性(key)可以是数字吗?

js中的new操作符与Object.create()的作用与区别

Javascript中的Object对象

详解Javascript中的Object对象

从 JavaScript 中的关联数组中获取第一项的最有效方法是啥?