javascript面向对象程序设计

原创 2015年11月18日 10:02:50
1、对象数据属性的类型
[Configurable]能否通过delete删除属性,能否修改属性特征,能够将数据属性改为访问器属性,默认值为true,一旦将变为false则不能修改其属性
[Enumberable]能否采用for-in循环返回属性,默认true
[Writable]是否可写
[Value]值 默认undefined
eg:


2、访问器属性
[Configurable]
[Enumberable]
[Get]

[Set]

<!doctype>
<html>
<head>
	<meta charset="UTF8">
</head>
<script type="text/javascript">
	var person = {
		name:"guoxiaofen"
	};
	//writable属性
	Object.defineProperty(person,"name",{
		writable:false//将属性设置为不可修改
	})
	console.log(person.name);
	person.name = "amry";
	console.log("After write " + person.name);
	//configurable
	Object.defineProperty(person,"name",{//调用defineProperty属性若不指名属性名则默认均为false
		configurable:false
	});
	console.log(person.name);
	delete person.name;
	console.log("After delete " + person.name);
	person.name = "小明";
	console.log("After write name " + person.name);
	// Object.defineProperty(person,"name",{//报错了
	// 	writable:true
	// });
	person.name = "小明";
	console.log("After write name " + person.name);
	//******************************************定义访问器属性*********************
	var book = {
		_year:2004,//标识只能通过访问器访问的属性
		edition:1
	}
	Object.defineProperty(book,"year",{
		set:function(newYear) {
			this._year = newYear;
			this.edition++;
		},
		get:function(){
			return this._year;
		}
	});
	book.year = 2005;
	console.log(book.edition);
	//或者通过如下方法定义访问器属性
	book.__defineGetter__('year1',function(){
		return this._year;
	});
	book.__defineSetter__('year1',function(newValue){
		this._year = newValue;
		this.edition++;
	});
	book.year1 = 2000;
	console.log(book.edition);
	//另一种定义数据和访问器属性的格式
	var myBook = {
		person:{
			value:"guoxiaofen"
		},
		_year:{
			value:2004
		},
		year:{
			get:function(){
				return this._year;
			},
			set:function(newValue){
				this._year = newValue;
			}
		}
	}

	//***************************************读取属性的特性
	var despriptor = Object.getOwnPropertyDescriptor(myBook,"year");
	console.log(despriptor.value.get);
	console.log(despriptor.configurable);

	//***************************************创建对象的方法
	//***************************************1.工厂模式,
	//*******缺点是下面的sayName函数就重复创建多次,而且不能很好地解决类别判断的问题
	 function createPerson(name,age,job){
	 	var o = new Object();
	 	o.name = name;
	 	o.age = age;
	 	o.job = job;
	 	o.sayName = function(){
	 		alert(this.name);
	 	}
	 	return o;
	 }
	 var Bob = createPerson('Lilei',29,'worker');
	 var MeiMei = createPerson('HanMeimei',28,'computer');
	 console.log(Bob instanceof Object);
	 //*********************************构造函数模式
	 //缺点是如果忘记new,则会把属性创建在全局作用域
	 function Person(name,age,job){
	 	this.name = name;
	 	this.age = age;
	 	this.job = job;
	 	this.sayName = function(){
	 		alert(this.name);
	 	}
	 }
	 var person1 = new Person('Lilei',20,"job");
	 var person2 = new Person('HanMeimei',20,'getOwnPropertyDescriptor');
	 console.log(person2.constructor == Person);//相当于对对象类别进行判断
	 console.log(person1 instanceof Person);//true
	 console.log(person1.sayName == person2.sayName);//false

	 //若将构造函数当成普通函数来使用,则在全局域创建属性
	 Person('world',30,'learning');
	 console.log(window.name);
	 //对某一个函数使用
	 var p = new Object();
	 Person.call(p,'Lilei',40,'happy');
	 console.log(p.age);

	 //**********************************************原型模式
	 //此类型对象可共享的内容最好放在原型链上
	 function Per(){}
	 Per.prototype.name = "guoxiaofen";
	 Per.prototype.age = 23;
	 Per.prototype.job = 'computer';
	 Per.prototype.sayName = function(){
	 	alert(this.name);
	 }
	 var a = new Per();
	 var b = new Per();
	 console.log(a.name);
	 a.name = "mada";//在自己的链上创建一个name属性,和prototype上的不是一个
	 console.log(b.name);
	 console.log(a.name);
	 console.log(a.__proto__);
	 console.log(Per.prototype.isPrototypeOf(a));
	 //true, 虽然不能访问某个特定对象的[[prototype]],但是可以根据如上形式加以判断
	 //EMACscript新增访问prototype的方法,如下
	 console.log(Object.getPrototypeOf(a) == Per.prototype);//true
	 console.log(Object.getPrototypeOf(a));

	 //hasOwnProperty()函数,判断自己是否有某个属性
	 a.name = "天才";
	 console.log(a.hasOwnProperty("name"));
	 console.log(b.hasOwnProperty("name"));

	 //原型模式与in操作符
	 console.log(a.name);//天才
	 console.log("name" in a); //true 自己的属性
	 delete a.name;
	 console.log("name" in a);//true  原型链上的属性
	 console.log(a.name);//guoxiaofen
	 //for-in()  所有可枚举属性,包括原型链上的
	 for(c in a){
	 	console.log("a 的 " + c);
	 }

</script>
</html>


JavaScript面向对象程序设计——对象

JavaScript面向对象程序设计——对象前言 JaveScript虽然说是支持面向对象的编程方法,但是JavaScript的面向对象在其他的强类型的面向对象语言(如Java,C#)甚至在其他弱类型...
  • qq_17004327
  • qq_17004327
  • 2017年06月18日 16:13
  • 271

面向对象程序设计考试题库 (附答案)

《面向对象程序设计》综合练习一(单选题)单选题1. C++源程序文件的缺省扩展名为(    )。A. cpp       B. exe       C. obj       D. lik2. 由C++...
  • Mobidogs
  • Mobidogs
  • 2007年03月04日 12:31
  • 6739

java面向对象程序设计期末测试题

测试题一 1.The term wrapper classes refers to   A. the Java classes that contain at least two da...
  • mxx0526
  • mxx0526
  • 2015年11月16日 21:18
  • 1451

面向对象程序设计基础总结

面向对象程序设计java基础总结
  • ivylingling123
  • ivylingling123
  • 2017年05月11日 19:58
  • 298

javascript面向对象程序设计

在学习js面向对象编程之前,首先需要知道什么是面向对象。面向对象语言都有类的概念,通过它可以创建具有相同属性和方法的对象。但js并没有类的概念,因此js中的对象和其他语言的对象有所不同。       ...
  • xiebaochun
  • xiebaochun
  • 2014年08月31日 09:38
  • 1311

面向对象程序设计有哪些基本特征?

 面向对象程序设计的基本特征有:      1,封装性:          封装性是指将对象相关的信息和行为状态捆绑成一个单元,即将对象封装为一个具体的类。封装隐藏了对象的具体实现,当要操纵     ...
  • yezhouyong
  • yezhouyong
  • 2010年08月07日 15:56
  • 16242

Java复习总结:Java面向对象程序设计 —面向对象(基础篇)

Java复习总结:Java面向对象程序设计 —面向对象(基础篇) 1.       面向对象的三大特征为:封装、继承、多态。 2.       类与对象的关系:类是对象的模板,对象是累的实例,类只...
  • chinaliuyan
  • chinaliuyan
  • 2011年11月17日 17:15
  • 666

JavaScript面向对象程序设计

JavaScript中的对象 JavaScript中对象的定义为:无序属性的集合,其属性可以包含基本值、对象或者函数。可以把对象想象成散列表,就是一组名值对(key:value),其中值可以是数据...
  • liushuo_whu
  • liushuo_whu
  • 2016年03月28日 23:35
  • 509

面向对象程序设计的4个主要特点

1.封装性. 它包含两个方面的含义.  将有关的代码和数据封装在一个对象中,各对象间相对独立,互不干扰.将对象中的某些部分对外隐蔽,隐蔽内部细节,只留下少量接口.        对象的内部实现和外部行...
  • fangfei_119
  • fangfei_119
  • 2008年07月23日 10:31
  • 14629

面向对象程序设计六大原则总结

原文http://blog.csdn.net/roypayne0305/article/details/41682285 一、“开-闭”原则(Open-Closed Principle,OCP) ...
  • fw0124
  • fw0124
  • 2015年04月01日 16:11
  • 1665
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:javascript面向对象程序设计
举报原因:
原因补充:

(最多只允许输入30个字)