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 语言中实现对私有实例成员、公有实例成员、私有静态成员、公有静态成员和静态类的封装。这次我们来讨论一下面向对象程序设计中的另外两个要素:继承与多态。 1 又...

JavaScript面向对象程序设计

1.创建对象 JavaScript 把对象定义为 : 无序属性的集合, 其属性可以包括基本值, 对象或者 函数. 每个对象都是基于一个引用类型创建的.(  引用类型可以是原生的, 也可以是开发人员...

javascript面向对象程序设计——封装(by vczero)

javascript面向对象程序设计——封装 javascript面向对象程序设计——封装 在javascript中,我们宣称是面向对象的程序设计。其实面向对象是js 与生俱来的特性,每...

JavaScript 面向对象程序设计(下)——继承与多态

前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员、公有实例成员、私有静态成员、公有静态成员和静态类的封装。这次我们来讨论一下面向对象程序设计中的另外两个要素:继承与多态。 1 又...

JavaScript高级编程(二)-面向对象程序设计

js中的面向对象函数表达式

JavaScript 面向对象程序设计(上)——封装

JavaScript 是一种非常灵活的面向对象程序设计语言,它与传统的强类型的面向对象程序设计语言(如 C++,Java,C# 等)有很大不同,所以要实现如 C++、java、C# 当中的一些特性就需...

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

JavaScript面向对象程序设计——继承简介 面向对象程序设计的三个特点是封装性,继承性和多态性,上一篇 已经详述了封装性的实现方法,这一篇博客将会详述继承性的实现方法。ES6中的继承 ES6中通...

JavaScript中的面向对象程序设计

面向对象程序设计主要是有3个特点:封装、继承、多态,这篇文章简单介绍如何在JavaScript实现类,以及如何继承类。类的实现js中没用关键字class,但是提供了关键字new和this。我们可以先声...

JavaScript 面向对象程序设计(下)——继承与多态

前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员、公有实例成员、私有静态成员、公有静态成员和静态类的封装。这次我们来讨论一下面向对象程序设计中的另外两个要素:继承与多态。 1...

JavaScript 面向对象程序设计(上)——封装

JavaScript 是一种非常灵活的面向对象程序设计语言,它与传统的强类型的面向对象程序设计语言(如 C++,Java,C# 等)有很大不同,所以要实现如 C++、java、C# 当中的一些特性就需...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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