[英]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.