javascript中的面向对象理解(一)


一、注意:提到“面向对象”这一概念,众所周知,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与其他语言的面向对象思想的差异已经有了一定的理解,那么接下来就让我们好好了解下,到底javascript的面向对象都有哪些内容:

二、理解javascript面向对象:

1、理解对象(js创建对象一般用两种方法):
(1)基于Object对象:

var stu=new Object();
   stu.name='jack';
   stu.age=20;
  stu.job='worker';
  stu.getjob=function(){return this.job;}
(2)基于对象字面量表达式:
 var stu={
   name:'jack',
   age:20,
   job:'worker',
   getjob:function(){alert(this.job);};
}
2、js的对象拥有属性以及方法,而属性本身又有“数据属性”和“访问器属性”两种类型,接下来,我们来说说对象属性的类型。


(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={}
Object.defineProperty(person,'name',{configurable:false,writable:false,value:'jack'});
alert(this.name);
结果:name的value值赋值不成功,因为设置的writable的属性值是false即不能重写。

(3)访问器属性:主要包括一对getter和setter函数,在读取访问器属性时,会调用getter返回有效值;写入访问器属性时,调用setter,写入新值;该属性有以下4个特征:

 ①configurable:表示是否能用“delete”删除操作符重新定义;

 ②Enumberable:表示能否用“for-in”循环查找该属性;

 ③ get:读取属性时调用(默认为undefined)

 ④ set:写入属性时调用(默认为undefined)

(4)访问器属性也不能直接定义,要用Object.defineProperty()来定义
eg:
  var person = {
     _age: 18
    };
   Object.defineProperty(person, 'isAdult', {
    get: function () {
        if (this._age >= 18) {
	  return true;
        } else {
            return false;
        }
    }
});
(5)定义多个属性的方法:
  Object.defiineProperties()接受两个参数:①属性所在的对象;②要添加或者修改的对象属性(要一一对应);
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;
}}
});
(6)读取属性的特性的方法:
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);



你可能感兴趣的:(javascript,杂谈,前端菜鸟学习笔记)