Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript对象只是一个关联数组吗?_Javascript - Fatal编程技术网

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

JavaScript对象只是一个关联数组吗?,javascript,Javascript,好的,我正在学习JavaScript的基础知识,我正在学习对象,在那里我遇到了这个例子 JavaScript var person = { firstname : "Smith", lastname : "Bach" }; 我们用PHP写的是 $person = array( "firstname"=>"Smith", "lastname"=>"Bach" ); 那么这是同一件事还是我在理解这个概念时犯了一个错误?它们是关联数组,而不仅仅是关联数组

好的,我正在学习JavaScript的基础知识,我正在学习
对象
,在那里我遇到了这个例子

JavaScript

var person = {
   firstname : "Smith",
   lastname  : "Bach"
};
我们用PHP写的是

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

那么这是同一件事还是我在理解这个概念时犯了一个错误?

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

编辑-我的意思是:

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


EcmaScript 5具有定义对象属性的机制,可以使它们不可变和不可编辑,这对某些人来说是有帮助的。如果要在对象中存储名为“toString”的属性,则仍然存在问题。

不,对象不止这些

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

例如:

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的一种方法):


你能给我举个例子吗?如果你能和PHP相比?或者,如果您不熟悉JS,也可以只使用JSPHP@Mr.Alien好的,我将扩展一下答案。感谢您的详细解释+1:)仅供参考,PHP的
数组
(在一个数据结构中混合使用数组和哈希映射)是一个糟糕而混乱的概念。您应该问“这是如何工作的”,而不是“这与PHP中的xyz有何相似之处”;)我不想在这里写一整本关于原型的书。我正在为那些已经对编程一知半解的人准备一门JS课程,所以如果你有兴趣,请告诉我。我现在真的需要开始OOP。顺便说一句,你的答案会更清楚,等待一段时间,直到我接受,我会奖励你+1,在一定程度上清除它:)@Mr.Alien然后我会推荐“JavaScript模式”书。这是一本好书。如果您需要更多,请尝试JavaScript:权威指南”。
// 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());