js 面向对象编程

[亡魂溺海] 提交于 2019-12-31 11:12:46

定义:

无序属性值的集合,属性可以是基本值,对象或者是函数。(数组也可以看做是对象,下标是属性名)

数据属性:

configurable :表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性或者能否把属性修改为访问器属性。
enumerable:表示能否通过for-in循环返回属性。
writable:表示能否修改属性的值。
value:包含这个属性的数据值。
要修改属性默认的特性(前三个默认为true,最后一个默认为undefined,这也是为什么属性定义了而未初始化的时候是undefined的原因。)。必须使用Object.defineProperty()方法,这个方法接受三个参数,属性所在的对象、属性的名字和一个描述符对象(上面四个中的一个或者多个)

访问器属性

configurable,enumerable属性同上。
get:在读取属性时调用的函数;
set:在设置属性时候使用的方法。
访问器属性不能直接定义,必须使用Object.defineProperty()来定义。

判断属性位置

通过in和hasOwnProperty()来确定属性是在原型中还是在对象中
in是沿着原型链一直寻找属性,而hasOwnProperty()只在当前对象中寻找。

三种遍历方式
for-in,Object.keys(),Object.getOwnPropertyNames()

防篡改对象

不可扩展 Object.preventExtens(obj);可删除
密封对象Object.seal(obj); 不可扩展,不可删除,已有成员的configurable置为false,但是可写;
冻结对象:Object.freeze(obj),不可扩展,不可删除,不可写;成员的writable置为false。

安全类型检测

	function isArray(v){
		return Object.prototype.toString.call(v) == '[object Array]'; //'[object RegExp]' '[object Function]'
	}
	alert(isArray([]));


测试代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body>
<script type="text/javascript" language="javascript">
	var person = {name:'wch'};
	person.name = 'wwww';
	Object.defineProperty(person,'name',{
		writable:false
	});
	person.name = '123';
	alert(JSON.stringify(Object.getOwnPropertyDescriptor(person,'name')));
	Object.defineProperty(person,'name',{});
	alert(JSON.stringify(Object.getOwnPropertyDescriptor(person,'name')));
	
	var book = {
		_year:2005,
		edition:1
	};
	Object.defineProperty(book,'year',{
		get:function(){
			return this._year;
		},
		set:function(newValue){
			this._year = newValue;
			this.edition ++;
		}
	});
	book.year = 2009;
	alert(book.edition);
	
	function Person(){
		this.name = 'wch';
	};
	Person.prototype = {
		name:'111',
		age:100
	};
	var person = new Person();
	alert(('age' in person) +' : '+ person.hasOwnProperty('age'));
	for(var key in person){
		alert(person[key]);
	}
	alert(Object.keys(person));
	alert(Object.getOwnPropertyNames(person));

	
	var person = {name : 'wch'};
	Object.preventExtensions(person);
	person.age = 29;
	alert(person.age);
	alert(person.name);
	delete person.name; //可删除
	alert(person.name);
	Object.seal(person);
	delete person.name; //不可删
	alert(person.name);
	person.name = '11111'; //可以写
	alert(person.name); 
	Object.freeze(person);
	delete person.name; //不可删
	alert(person.name);
	person.name = '11111'; //不可以写
	alert(person.name); 
</script>
</body>

</html>



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!