js中的面向对象程序设计(1)-对象和属性的类型

js中的面向对象程序设计

js中的对象:一组无序属性的结合。

一、js中的对象

1.自定义对象

var person = new Object();
person.name = 'jack';
person.age = 29;

person.sayName = function(){
	alert(this.name);
}

2.字面量对象

var person = {

	name:'tom',
	age:10,
	
	sayName:function(){
		alert(this.name);
	}
	
};

二、js中属性的类型(属性有两种特性:数据属性+访问器属性)

1.数据属性

在js中不能直接访问,为了实现js引擎所用。

[[Configurable]]:是否能够通过delete删除属性,是否修改属性的特性,是否能把数据属性改为访问器属性。默认为true
[[Enumerable]]:是否能够通过for-in的方式循环属性。默认true
[[Writeable]]:是否可以修改属性。默认true
[[Value]]:属性的数据值。默认undefined

例如:

var person = {
	name:'tom'
};

[[Value]]特性被设置为’tom’

修改属性的默认特性:Object.defineProperty();

var person = {};

Object.defineProperty(person,'name',{
	writeable:false,//属性不可写
	value:'jack'
});

alert(person.name);//jack
person.name='greg';
alert(person.name);//jack

//对于configurable特性

var person = {};

Object.defineProperty(person,'name',{
	configurable:false,
	value:'tom'
});

alert(person.name);//tom
delete person.name;//因为configurabl=false,所以啥也不会发生,在严格模式下会报错的。
alert(person.name);//tom

注意:
1.configurable特性一旦设置为false,就不能改成true了,否则报错。
2.一旦调用Object.defineProperty()方法时,configurable、enumerable、writeable特性默认设置为false。

2.访问器属性
[[Configurable]]:默认为true
[[Enumerable]]:默认为true
[[Get]]:默认为undefined
[[Set]]:默认为undefined

访问器属性不能直接定义,只能使用Object.defineProperty()方法来定义。

var book = {
	_year:2004,//一般下划线开头的属性,只能通过对象内部方法才能访问。
	edition:1
};

Object.defineProperty(book,'year',{//year为访问器属性
	get:function(){
		return this._year;
	}
	
	set:function(newValue){
		if(newValue>2004){
			this._year = newValue;
			this.edition += newValue - 2004;
		}
	}
});


book.year = 2005;//在为访问器属性赋值的时候,可以修改别的属性。
alert(book.edition);//2

*为对象定义多个属性:所有的属性在同一时间创建

Object.defineProperties();

example:

var book = {};

Object.defineProperties(book,{
	_year:{//数据属性
		writeable:true,
		value:2004
	},
	
	edition:{//数据属性
		writeable:true,
		value:1
	}
	
	
	year:{//访问器属性
	
		get:function(){
			return this._year;
		},
		
		set:function(newValue){
			
			if(newValue > 2004){
				this._year = newValue;
				this.edition += newValue - 2004;
			}
		}
	}
});

三、读取属性的特性

Object.getOwnPropertyDescriptor();

example:

接前面book的例子。

var descriptor = Object.getOwnPropertyDescriptor(book,'_year');//数据属性
alert(descriptor.value);//2004
alert(descriptor.configurable);//false,因为调用了Object.defineProperty(),没有配置configurable,即默认为false
alert(typeof descriptor.get);//'undefined'


var descriptor = Object.getOwnPropertyDescriptor(book,'year');//访问器属性
alert(descriptor.value);//undefined
alert(descriptor.enumerable);//false
alert(typeof descriptor.get);//'function'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值