一、注意:提到“面向对象”这一概念,众所周知,javascript中的面向对象思想与其他的编程语言(例如:PHP、Java等)是有着很大区别的。因此,我们先复习下,传统意义上,面向对象的相关概念,以便我们后面更好的将javascript与其他语言的面向对象概念区分开来:
1.其他面向对象语言:面向对象的语言有一个标志,即拥有类(class)的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装、继承、多态的特性!(php/java/c#等)
eg:以c#语言为例
public class Person{
public Person(name,sex){
this.name=name;
this.sex=sex;
}
public string name;
public string sex;
public void show(){Console.Write(name+);}}//调用如下:
Person p=new Person();
p.show();
javascript中的面向对象:ECMA标准定义JS中的对象:无序属性的集合,其属性可以包含基本值、对象或者函数。可以简单理解为JS的对象是一组无序的值,其中的属性或方法都有一个名字,根据这个名字可以访问相映射的值(值可以是基本值/对象/方法)。(即:在js中的对象是以“属性/方法:值”组合而成的无序集合)。
eg:
var person = {
name : 'My name',
age : 18,
getName : function(){
return this.name;
}
}
二、理解javascript面向对象:
1、理解对象(js创建对象一般用两种方法):
(1)基于Object对象:
var stu=new Object();(2)基于对象字面量表达式:
stu.name='jack';
stu.age=20;
stu.job='worker';
stu.getjob=function(){return this.job;}
var stu={2、js的对象拥有属性以及方法,而属性本身又有“数据属性”和“访问器属性”两种类型,接下来,我们来说说对象属性的类型。
name:'jack',
age:20,
job:'worker',
getjob:function(){alert(this.job);};
}
(1)数据属性:javascript 数据属性指包含一个数据值的位置,可在该位置读取或写入值,该属性(数据属性)有4个供述其行为的特性:
①configurable:表示能否用“delete”删除操作符重新定义,或能否修改访问属性(默认为true);
②Enumberable:表示能否用“for-in”循环返回属性(默认为true);
③writable:表示能否修改属性的值(默认为true);
④value:包含该属性的值。(默认为undefined)
(2)js中数据属性的默认值是可以修改的,要修改的话得调用Object.defineProperty()方法。
①Object.defineProperty带三个参数,即Object.defineProperty(属性所在对象,属性名,描述性对象<必须是configurable、Enumberable、writable以及value中的一个或多个>)
eg:
var person={}结果:name的value值赋值不成功,因为设置的writable的属性值是false即不能重写。
Object.defineProperty(person,'name',{configurable:false,writable:false,value:'jack'});
alert(this.name);
(3)访问器属性:主要包括一对getter和setter函数,在读取访问器属性时,会调用getter返回有效值;写入访问器属性时,调用setter,写入新值;该属性有以下4个特征:
①configurable:表示是否能用“delete”删除操作符重新定义;
②Enumberable:表示能否用“for-in”循环查找该属性;
③ get:读取属性时调用(默认为undefined)
④ set:写入属性时调用(默认为undefined)
(4)访问器属性也不能直接定义,要用Object.defineProperty()来定义
eg:
var person = {(5)定义多个属性的方法:
_age: 18
};
Object.defineProperty(person, 'isAdult', {
get: function () {
if (this._age >= 18) {
return true;
} else {
return false;
}
}
});
Object.defiineProperties()接受两个参数:①属性所在的对象;②要添加或者修改的对象属性(要一一对应);
eg:
var book={};(6)读取属性的特性的方法:
Object.defineProperties(book,{
_year:{value:2014,configuraable:false;},
eidtion:{value:1,enumberable:false;},
year:{
get:function(){return:this._year;}
},
set:function(){if(newvalue>2014){
this._year=newvalue;
this.edition+=newvalue-2014;
}}
});
Object.getOwnPropertyDescriptor(),接受两个参数:①属性所在的对象;②要读取的描述性属性的特性的名称,eg:
数据属性的描述性属性有:configurable、enumerable、writable、value
访问器属性的描述性属性有:configurable、enumerable、get、set
eg:
var book={};
Object.defineProperties(book,{
_year:{value:2014,configuraable:false;},
eidtion:{value:1,enumberable:false;},
year:{
get:function(){return:this._year;}
},
set:function(){if(newvalue>2014){
this._year=newvalue;
this.edition+=newvalue-2014;
}}
});
var description=Object.getOwnPropertyDescriptor(book,"_year");
alert(description.value);
alert(description.configurable);