JavaScript読書ノート4



オブジェクトを作成する最も簡単な方法は、Objectのインスタンスを作成し、属性と方法を追加します.
 
var person = new Object();
person.name = "Miles";
person.age = 24;
person.job = "Software Engineer"

person.sayName = function() {
    alert(this.name);
};

person.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 person1 = createPerson("Miles", 24, "Software Engineer");
var person2 = createPerson("Jenny", 24, "Doctor");

person1.sayName();  //"Miles"
person2.sayName();  //"Jenny"
   
工場モードでは、複数の死にたい相手を作る問題を解決しましたが、対象認識の問題を解決できませんでした.
 
jsの発展とともに,構造関数モードが現れた.
 
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        alert(this.name);
    };
}

var person1 = new Person("Miles", 24, "Software Engineer");
var person2 = new Person("Jenny", 24, "Doctor");

person1.sayName();  //"Miles"
person2.sayName();  //"Jenny"
 
 
コンストラクタと他の関数との唯一の違いは彼らを呼び出す方法が違うことにある.コンストラクタも関数です.newオペレータを通じて呼び出せば、構造関数として機能します.newを通さないと、普通の関数と変わりません.
 
//        
var person = new Person("Miles", 24, "Software Engineer");
person.sayName(); // "Miles"
//        
Person("Jenny", 24, "Doctor");
window.sayName(); // "Jenny"
//             
var o = new Person();
Person.call(o, "Sean", 24, "Engineer");
o.sayName(); // "Sean"
 
グローバルスコープで関数を呼び出すと、thisオブジェクトは常にGlobalオブジェクトだけを考えます.
 
コンストラクタの欠点は、各方法が各インスタンスで再作成されることです.つまり、上の例では、sayNameはそれぞれ同じFunctionではない例です.
 
alert(person1.sayName() == person2.sayName()); // false
その後、完全に同じタスクを2つ作成するFunctionのインスタンスは必要ないので、関数定義を構造関数の外部に移すことによって、この問題を解決することができる.
 
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = sayName;
}
function sayName() {
        alert(this.name);
}
 
個人ブログと同時に更新中です.