簡體   English   中英

JavaScript Object只是一個關聯數組嗎?

[英]Is JavaScript Object nothing but an associative array?

好的,我只是通過JavaScript的基礎知識,我正在學習我遇到這個例子的objects ......

JavaScript的

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

我們用PHP編寫的是

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

這是同樣的事情,還是在理解這個概念時犯了錯誤?

不,對象不止於此。

Object確實是一個map / dictionary,但是另外每個對象都從另一個對象繼承了一些屬性(鍵值對)。 那個其他對象叫做原型。

例如:

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() ),其名稱可能與屬性名稱沖突。 對象可以通過其他函數構造,也可以提供更多的繼承屬性。

編輯 - 我的意思是:

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

因此,新創建的空對象似乎具有名為“toString”的屬性。 JavaScript的問題在於,只有一個屬性訪問器運算符(兩個,但它們是同一個東西的兩種),因此無法區分對數組內容的訪問和對數組API的訪問。 (另外,在JavaScript中,使用“數組”這個詞來思考它們確實不是一個好主意,因為這意味着JavaScript中的不同之處 - 數組是一種具有特殊屬性的Object。)

EcmaScript 5具有以這樣的方式定義對象屬性的機制,即使它們不可變和不可迭代,這有助於一些 如果要在對象中存儲名為“toString”的屬性,則仍然存在問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM