javascript - 面向对象 – 对象、对象属性
创建javascript对象可以通过两种方式:创建Object对象和创建字面量对象。
-
/**
-
* 面向对象
-
*/
-
-
/** 创建对象 **/
-
var person = new Object();
-
person.name = "Nicholas";
-
person.age = 29;
-
person.job = "Soft Engineer";
-
-
person.sayName = function() {
-
console.log(this.name);
-
};
-
-
/** 字面量方式 **/
-
var person1 = {
-
name: "Nicholas",
-
age: 29,
-
job: "Soft Engineer",
-
-
sayName: function() {
-
console.log(this.name);
-
}
-
};
Javascript 对象属性的特性
对象的属性特性,可以通过Object.defineProperty(object, property, descritor)设置:
- configurable ,属性是否可配置。可配置的含义包括:是否可以删除属性( delete ),是否可以修改属性的 writable 、enumerable 、 configurable 属性。
- enumerable ,属性是否可枚举。可枚举的含义包括:是否可以通过 for...in 遍历到,是否可以通过 Object.keys() 方法获取属性名称。
- writable ,属性是否可重写。可重写的含义包括:是否可以对属性进行重新赋值。
-
value ,属性的默认值。
使用Object.defineProperty方法定义configurable、 enumerable、 writable 特性时,没有指定的特性默认是false
-
//"use strict"; //严格模式
-
/**
-
* 面向对象 - 对象属性的数据属性
-
* 数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性4个特性: Configurable, Enumerable, Writable, Value 。
-
* Configurableb 表示是否能修改属性的其它特性,或使用delete删除属性,默认为true。
-
* Enumerable 是否能通过for in 循环列举出对象的该属性,默认true。
-
* Writable 能否修改属性的值(也即是下面的Value值),默认true。
-
* Value 表示属性的数据值,默认是undefined(未赋值)
-
*/
-
-
// 创建一个对象
-
var person = {
-
name: "Nicholas"
-
};
-
-
/**
-
* 上面创建了一个名称为person的对象,属性name的4个特性:Configurable(true),Enumerable(true), Writable(true), Value("Nicholas")。
-
*/
-
-
/**
-
* 修改属性的默认特性,Object.defineProperty(obj, propertyName, descObj)
-
* 接受3个参数:属性所在对象,属性名,属性特性描述符对象,如下
-
*/
-
-
Object.defineProperty(person, "name", {
-
writable: false, // 是否能修改name属性,false 即是只读状态
-
value: "Nick"
-
});
-
-
console.log(person.name); //Nick
-
-
//属性特性writable设置为false,这里无法修改name属性的值,严格模式下会抛出不会出现报错。非严格模式会被忽略,name还是Nick。
-
person.name = "James"; // 设置无效
-
-
console.log(person.name); // Nick
-
-
Object.defineProperty(person, "name", {
-
writable: true
-
});
-
-
person.name = "James";
-
console.log(person.name); //James
-
-
/**
-
* configurable 一旦将属性设置为false,将不能在设置为true
-
*/
-
-
Object.defineProperty(person, "name", {
-
configurable: false // 不能通过delete删除属性
-
});
-
// 抛出错误
-
/**
-
Object.defineProperty(person, "name", {
-
configurable: true
-
}); **/
-
-
delete person.name; // 非严格模式无效,严格模式抛错
-
console.log("name = " + person.name);
- set ,一旦属性被重新赋值,此方法被自动调用。
- get ,一旦属性被访问读取,此方法被自动调用。
-
var book = {
-
_year: 2004,
-
edeition: 1
-
};
-
-
// 定义属性year,用来访问_year
-
Object.defineProperty(book, "year", {
-
get: function() {
-
console.log("execute get");
-
return this._year;
-
},
-
set: function(newValue) {
-
console.log("execute set");
-
if (newValue > 2004) {
-
this._year = newValue;
-
this.edeition += newValue - 2004;
-
}
-
}
-
-
});
对象的属性特性:数值特性和访问器特性。数值特性configurable、enumerable、writable、value,代表值和状态。访问器特性没有值,只有一对方法get和set。