好的,我只是在学习 JavaScript 的基础知识,我正在学习objects
我在哪里遇到这个例子......
JavaScript
var person = {
firstname : "Smith",
lastname : "Bach"
};
而我们用 PHP 写的是
$person = array(
"firstname"=>"Smith",
"lastname"=>"Bach"
);
那么这是同一件事还是在理解这个概念时犯了错误?
好的,我只是在学习 JavaScript 的基础知识,我正在学习objects
我在哪里遇到这个例子......
JavaScript
var person = {
firstname : "Smith",
lastname : "Bach"
};
而我们用 PHP 写的是
$person = array(
"firstname"=>"Smith",
"lastname"=>"Bach"
);
那么这是同一件事还是在理解这个概念时犯了错误?
不,对象不止于此。
对象确实是一个映射/字典,但另外每个对象都从另一个对象继承了一些属性(键值对)。另一个对象称为原型。
例如:
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()
),其名称可能与属性名称冲突。对象可以通过其他函数构造,也可以赋予更多的继承属性。(请注意,普通对象没有的一件事是计数条目的.length
属性,就像数组对象一样。术语“关联数组”可能不是用于 JavaScript 对象的最佳术语;它们是对象,应该是熟悉 JavaScript 就足够了。)
编辑——我的意思是:
var o = {};
alert("toString" in o); // alerts "true"
因此,一个新创建的空对象似乎有一个名为“toString”的属性。JavaScript 的问题在于只有一个属性访问器运算符(两个,但它们是同一事物的两种风格),因此无法区分对数组内容的访问和对数组 API 的访问。(另外,在 JavaScript 中,使用“数组”这个词来考虑它们确实不是一个好主意,因为这在 JavaScript 中意味着不同的东西——数组是一种具有特殊属性的对象。)
EcmaScript 5 具有以使它们不可变和不可迭代的方式定义对象属性的机制,这有助于一些. 如果你想在一个对象中存储一个名为“toString”的属性,这仍然是个问题。