JavaScript作成対象詳細


JavaScriptでは、Objectのコンストラクタやオブジェクトの字面の量を単一のオブジェクトを作成するために使用することができますが、これらの方法は明らかな欠点があります.
1.工場モード
    工場モードはソフトウェアエンジニアリング分野でよく知られている設計モードであり、このようなモードは具体的なオブジェクトを作成する過程を抽象的に示しています.ECMAScriptでクラスを作成できないことを考慮して、開発者は特定のインターフェースでオブジェクトを作成するための関数を発明して、関数でカプセル化します.
 
 
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 person1 = createPerson("Jam",29,"Soft Engineer");
var person2 = createPerson("Sam",24,"Doctor");
モードは の を する を しましたが、 の (つまりどのように のタイプを っていますか?)が されません.JavaScriptの に って、 しいモデルが しました.
2.コンストラクタモード
    ECMAScriptの の は、 のタイプのオブジェクトを するために できます.ObjectやArayのような の は、 に に に れます.また、カスタムオブジェクトタイプの と を するために の を します. モードを って、 の を き えます.
function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function () {
        alert(this.name);
    };
}

var person1 = new Person("Jim",29,"Software Engineer");
var person2 = new Person("Sam",24,"Doctor");
ここで、Person はcreatePerson() に って わられます. は なるところがあります.
    1) されていない オブジェクト.
    2) と をthisオブジェクトに しました.
    3)return がありません.
    4) の は で、 のOO を にしました.
Personの しいインスタンスを するには、newオペレータを しなければならない.このように を び すと、 には の4つのステップがある.
    1) しいオブジェクトを します.
    2) のスコープを しいオブジェクトに り てます.
    3)コンストラクタのコードを します.
    4) しいオブジェクトを します
オブジェクトのconstructor は、 にオブジェクトのタイプを するために されました.しかし、 のタイプといえば、instance ofオペレータの がより が いです.この で したすべてのオブジェクトは、 Objectの であり、Personの でもあります.
    alert(person 1.com nstructor==Person);   //true
    alert(person 1 instance of Object);         //true
    alert(person 1 instance of Person);         //true
カスタムのコンストラクタを すると、 はそのインスタンスを のタイプとして することができるということです.これはまさに モデルが モデルよりも れているところです.
    1)コンストラクタを として う
    コンストラクタと の の の いは、それらを び す が っています.しかし、コンストラクタは であり、コンストラクタを する な は しません.どの も、newオペレータを じて び されれば、コンストラクタとして します.どの もnewオペレータを じて び さないと、 の と じです.
//        
var person = new Person("Lucy",23,"QA");
person.sayName();//Lucy

//        
Person("Linis",23,"QA");//   window
window.sayName();//Linis

//             
var o = new Object();
Person.call(o,"Tom",25,"Teacher");
o.sayName();//Tom
:グローバルスコープで を び すと、thisオブジェクトは にGlobalオブジェクトを します.
    2)コンストラクタの
    は いが、 がないわけではない. な は、 が で されることであり、ECMAScriptの は である.したがって、 を するごとに、オブジェクトを することである. には、このときの もこのように されている.
function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = new Function("alert(this.name)");
}
このように を すると、 なる ドメインチェーンと が じるが、Functionの しいインスタンスを するメカニズムは として じである.したがって、 なる での は しくない.
alert(person1.sayName = person2.sayName);    //false
しかし、 じタスクを する2つのFunctionのインスタンスを する はない.それにthisオブジェクトがあります.コードを する に を のオブジェクトに びつける はありません.したがって、 の を の に すことによってこの を します.
function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = sayName;
}

function sayName() {
    alert(this.name);
}
3. モード
    たちが した にはプロトタイプの があります.この はポインタでオブジェクトを します.このオブジェクトの は のタイプのすべてのインスタンスで できる と を みます.つまり、プロトタイプとは、 を び して されたそのオブジェクトの の オブジェクトのことであり、プロトタイプオブジェクトを する は、すべてのオブジェクトインスタンスにその まれる および を することができ、 い えれば、 においてオブジェクトインスタンスの を する はなく、これらの を プロトタイプオブジェクトに することができるということである.
function Person(){}

Person.prototype.name = "Tom";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function() {
    alert(this.name);
};

var person1 = new Person();
person1.sayName();//Tom
var person2 = new Person();
person2.sayName();//Tom
alert(person1.sayName = person2.sayName); //true
    1) の を する
    いつでも、 しい を すると、 のルールに って のプロトタイプ を します.この のプロトタイプオブジェクトです.デフォルトでは、すべてのプロトタイプオブジェクトが にconstructor を します.この はプロトタイプの の を すポインタを みます.Person.prototype.com nstructorはPersonを します.
    カスタムコンストラクタを した 、 のオブジェクトはデフォルトでconstructor のみを します. の については、Objectから き ぎます.
    2) とin
    in は、 で し、for-iサイクルで します. で する 、in は、オブジェクトを して された にアクセスできるときにtureに ります.この がインスタンスに するか、プロトタイプに なく、tureに ります.
function Person(){}
Person.prototype.name = "Tom";
Person.prototype.age = 23;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function() {
    alert(this.name);
};

var person1 = new Person();
var person2 = new Person();

alert(person1.hasOwnProperty("name"));  //false
alert("name" in person1);  //true

person1.name = "Jime";
alert(person1.name);  //Jime  --    
alert(person1.hasOwnProperty("name"));  //true
alert("name" in person1);  //true

alert(person2.name);  //Tom --    
alert(person2.hasOwnProperty("name"));  //false
alert("name" in person2);  //true

delete person1.name;
alert(person1.name);  //Tom  --    
alert(person1.hasOwnProperty("name"));  //false
alert("name" in person1);  //true