概述
创建自定义对象的方式有两种:
* 创建一个 Object 实例,然后再为它添加属性和方法:
//创建 Object 的实例
var person = new Object();
person.name = "deniro";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function () {
console.log(this.name);
};
- 对象字面量方式(已成为首选模式):
//对象字面量语法
var person = {
name: "deniro",
age: 29,
job: "Software Engineer",
sayName: function () {
console.log(this.name);
}
}
ECMA-262 第 5 版,定义了只有内部才能使用到的属性,这些属性是用于 JavaScript 引擎的实现上,因此 JavaScirpt 不能直接访问到它们,它们一般用两对方括号表示,比如[[Enumerable]]。
1 数据属性
数据属性包含一个数值的位置,在这个位置上可以读取和写入值。数据属性有四个描述其行为的特性:
特性 | 说明 | 默认值 |
---|---|---|
[[Configurable]] | 能否通过 delete 删除属性 | true |
[[Enumerable]] | 能否通过 for-in 循环返回属性 | true |
[[Writable]] | 能否修改属性的值 | true |
[[Value]] | 包含这个属性的数据值 | undefined |
var person = {
name: "deniro"
}
上面这个例子中的 name 属性的 [[Value]] 被设定为 deniro,其他值设置为 true。
要修改属性的默认特性,必须使用 ECMAScript 5 的 Object.defineProperty() 方法。它接受三个参数:属性所在的对象,属性名以及描述符对象。其中的描述符对象必须是 configurable、enumerable、writable 和 value:
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "deniro"
});
console.log(person.name);//deniro
person.name = "Lily";
console.log(person.name);//deniro
一个属性被设置为不可修改后,如果尝试为它设置新值,在非严格模式下,会被忽略;在严格模式下,会抛出错误。
把属性设置为不可配置:
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
value: "deniro"
});
console.log(person.name);//deniro
delete person.name;
console.log(person.name);//deniro
configurable 设置为 false,表示不能从对象中删除属性。如果这时对这个属性调用 delete,在非严格模式下,会被忽略;在严格模式下,会抛出错误。
一旦把属性定义为不可配置(configurable 设置为 false),就不能再把它定义为可配置的了:
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
value: "deniro"
});
//抛错
Object.defineProperty(person, "name", {
configurable: true,
value: "deniro"
});
在调用 Object.defineProperty() 方法时,如果不指定,configurable、enumerable、writable 会默认为 false。多数情况下,没有必要使用 Object.defineProperty() 方法,但理解这些概念有助于对于理解 JavaScript 对象。
注意: IE8 是第一个实现 Object.defineProperty() 的浏览器。然而这个版本的实现存在很多限制。因为实现的不彻底,所以建议大家不要在 IE8 中使用 Object.defineProperty()。
2 访问器属性
访问器是一对 getter 和 setter 函数(非必须)。使用 getter 读取访问器属性,使用 setter 写入访问器属性。它有 4 个特性:
特性 | 说明 | 默认值 |
---|---|---|
[[Configurable]] | 能否通过 delete 删除属性 | true |
[[Enumerable]] | 能否通过 for-in 循环返回属性 | true |
[[Get]] | 在读取属性时调用的函数 | undefined |
[[Set]] | 在写入属性时调用的函数 | undefined |
访问器属性必须使用 Object.defineProperty() 来定义:
var book = {
_year: 2016,
edition: 1
};
Object.defineProperty(book, "year", {
get: function () {
return this._year;
},
set: function (newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2016;
}
}
});
book.year = 2017;
console.log(book.edition);//2
_year 前面的下划线表示只能通过对象方法访问的属性。
使用访问器的常见方式是,设置一个属性的值会导致其他属性值发生变化。
只指定 getter 表示属性为只读。在严格模式下,尝试写入会抛错。只指定 setter 表示属性为只写。在非严格模式下,返回 undefined;在严格模式下,尝试读取会抛错。
在不支持 ECMAScript 5 的浏览器中,一般有两个非标准方法:__defineGetter__()
和__defineSetter__()
,这两个方法会是由 Firefox 定义的,后来 Safari 3、Chrome 1、Opera 9.5 也给出了相同的实现。
下面用遗留的方法重写了之前的例子:
var book = {
_year: 2016,
edition: 1
};
book.__defineGetter__("year", function () {
return this._year;
});
book.__defineSetter__("year", function (newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2016;
}
});
book.year = 2017;
console.log(book.edition);//2
注意:在不支持 Object.defineProperty() 方法的浏览器中,不能修改 [[Configurable]] 和 [[Enumerable]]。
3 定义多个属性
ECMAScript 5 定义的 Object.defineProperties(),可以一次定义多个属性。它接受两个参数(要添加和修改其属性的对象、定义的属性):
var book = {};
Object.defineProperties(book, {
_year: {
value: 2016
},
edition: {
value: 1
},
year: {
get: function () {
return this._year;
},
set: function () {
if (newValue > 2016) {
this._year = newValue;
this.edition += newValue - 2016;
}
}
}
});
4 读取属性的特性
ECMAScript 5 定义的 Object.getOwnPropertyDescriptor() ,会读取属性的特性。它接受两个参数(属性所在的对象、要读取描述符的属性名称),返回值是对象,可能是访问器属性,也可能是数据属性:
var book = {};
Object.defineProperties(book, {
_year: {
value: 2017
},
edition: {
value: 1
},
year: {
get: function () {
return this._year;
},
set: function (newValue) {
if (newValue > 2017) {
this._year = newValue;
this.edition += newValue - 2017;
}
}
}
});
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
console.log(descriptor.value);//2017
console.log(descriptor.configurable);//false
console.log(typeof descriptor.get);//undefined
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor.value);//undefined
console.log(descriptor.configurable);//false
console.log(typeof descriptor.get);//function
在支持 ECMAScript 5 版本的 JavaScript 中,可以针对任何对象(包括 DOM 和 BOM),使用 Object.getOwnPropertyDescriptor 方法。
最后
以上就是优秀月亮为你收集整理的说说对 JavaScript 对象的理解1 数据属性2 访问器属性3 定义多个属性4 读取属性的特性的全部内容,希望文章能够帮你解决说说对 JavaScript 对象的理解1 数据属性2 访问器属性3 定义多个属性4 读取属性的特性所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复