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;
    }
 }

上記の2つの例を通じて、javascriptと他の言語のオブジェクト指向思想の違いについて一定の理解があると信じています.では、javascriptのオブジェクト指向にはどのような内容があるのかをよく理解してみましょう.
二、javascriptがオブジェクトに向いていることを理解する:
1、オブジェクトを理解する(jsオブジェクトを作成するには一般的に2つの方法が用いられる):(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);};
}
、jsのオブジェクトは属性およびメソッドを有し、属性自体には「データ属性」と「アクセサ属性」の2種類があり、次に、オブジェクト属性のタイプについて説明する.
(1)データ属性:javascriptデータ属性とは、1つのデータ値を含む位置を指し、その位置で値を読み取るか書き込むことができる.この属性(データ属性)には、その動作を供述する4つの特性がある:1 configurable:オペレータを削除して再定義できるかどうか、またはアクセス属性を変更できるかどうか(デフォルトはtrue);②Enumberable:「for-in」ループで属性を返すことができるかどうかを示す(デフォルトはtrue).③writable:属性の値を変更できるかどうかを示す(デフォルトはtrue);④value:属性の値が含まれます.(デフォルトはundefined)(2)jsのデータ属性のデフォルト値は変更可能であり、変更するにはObjectを呼び出す.defineProperty()メソッド. ①Object.definePropertyには3つのパラメータ、すなわちObjectがある.defineProperty(属性が存在するオブジェクト、属性名、記述オブジェクト)eg:
var person={}
Object.defineProperty(person,'name',{configurable:false,writable:false,value:'jack'});
alert(this.name);
結果:設定したwritableの属性値がfalseであるため、nameのvalue値の付与は成功しませんでした.
(3)アクセサ属性:主にgetterとsetter関数のペアを含み、アクセサ属性を読み取るとgetterを呼び出して有効値を返す.アクセサ属性を書き込むときはsetterを呼び出し、新しい値を書き込む.このプロパティには、次の4つのフィーチャーがあります.
①configurable:オペレータを削除して再定義できるかどうかを示す.
②Enumberable:この属性を「for-in」ループで検索できるかを示す.
③get:属性読み出し時に呼び出す(デフォルトはundefined)
④set:属性書き込み時に呼び出す(デフォルトはundefined)
(4)アクセサ属性も直接定義することができず,Objectを用いる.定義
eg:
  var person = {
     _age: 18
    };
   Object.defineProperty(person, 'isAdult', {
    get: function () {
        if (this._age >= 18) {
	  return true;
        } else {
            return false;
        }
    }
});
(5)複数の属性を定義する方法:
  Object.defiineProperties()は2つのパラメータを受け入れます:1属性が存在するオブジェクト;②対象属性を追加または変更する(1つずつ対応する);
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()は、1属性が存在するオブジェクトと、2つのパラメータを受け入れます.②読み込む記述属性の特性の名前、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);