10

わかりました、JavaScript の基礎を学んobjectsでいて、この例に出くわした場所を学んでいました...

JavaScript

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

そしてPHPで書くのは

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

これは同じことですか、それとも概念の理解に誤りがありますか?

4

2 に答える 2

11

いいえ、オブジェクトはそれ以上のものです。

オブジェクトは確かにマップ/辞書ですが、さらにすべてのオブジェクトは別のオブジェクトからいくつかのプロパティ (キーと値のペア) を継承します。その別のオブジェクトはプロトタイプと呼ばれます。

例えば:

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 を実行する方法の1 つです)。

// 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());
于 2012-12-25T14:32:19.227 に答える
2

それらは連想配列ですが、連想配列だけではありません。Objectプロトタイプから利用できる関数( など.toString()) があり、その名前はプロパティ名と衝突する可能性があります。オブジェクトは他の関数を介して構築することができ、さらに継承されたプロパティを与えることもできます。(単純なオブジェクトが持っていないものの1 つは、配列オブジェクトが持っているようなエントリをカウントする.lengthプロパティであることに注意してください。「連想配列」という用語は、おそらく JavaScript オブジェクトに使用するのに最適なものではありません。それらはオブジェクトであり、そうあるべきです。 JavaScript に慣れたら十分です。)

編集— つまり、これは次のとおりです。

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

したがって、新しく作成された空のオブジェクトには、「toString」というプロパティがあるように見えます。JavaScript の問題は、プロパティ アクセサー演算子が 1 つしかないことです (よく 2 つですが、同じものの 2 つのフレーバーです)。そのため、配列の内容へのアクセスと配列の API へのアクセスを区別する方法がありません。(また、JavaScript では、「配列」という言葉を使用してそれらを考えることは、実際には良い考えではありません。これは、JavaScript では何か異なることを意味するためです。配列は、特別なプロパティを持つオブジェクトのタイプです。)

EcmaScript 5 には、オブジェクト プロパティを不変かつ反復不可能にするような方法でオブジェクト プロパティを定義するメカニズムがあり、一部の. オブジェクトに「toString」というプロパティを格納したい場合は、まだ問題があります。

于 2012-12-25T14:16:47.367 に答える