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。 
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号