JavaScriptの対象向けプログラム設計1—オブジェクト作成方式

2813 ワード

1.工場モード
function createPerson(name, age) {
	var obj = new Object();
	obj.name = name;
	obj.age = age;
	obj.say = function() {
		alert(this.name);
	};
	return obj;
}
	var p1 = createPerson('shadow', 23);
	p1.say();
2.コンストラクタモード
    2.1 new呼び出しを使用する
function Person(name, age) {
	this.name = name;
	this.age = age;
	this.say = function() {
		alert(this.name);
	};
}
var p1 = new Person('shaow', 23);
    p1.say();
 
    2.2 new呼び出しを使用しない
Person('shadow', 21);
window.say();
 
    2.3別のオブジェクトのスコープで呼び出し
var o = new Object();
Person.call(o, 'shadow', 24);
o.say();
 
3.原型モード    3.1オブジェクトのインスタンスを通じてプロトタイプの値を保存することができますが、オブジェクトのインスタンスを通してプロトタイプの値を書き換えることはできません.
function Person() {
				
}
Person.prototype.name = "prototype val";
var p1 = new Person();
var p2 = new Person();
p1.name = "object val";
alert(p1.name);//prototype val
alert(p2.name);//object val
 
     オブジェクトに属性を追加すると、元のオブジェクトの同じ属性のみがブロックされ、元のオブジェクトの属性は変更されません.
    3.2 deleteを使用してインスタンス属性を削除することができます.
function Person() {
				
}
Person.prototype.name = "prototype val";
var p1 = new Person();
var p2 = new Person();
p1.name = "object val";
delete p1.name;
alert(p1.name);//prototype val
alert(p2.name);//prototype val
 
    3.3ハスOwnProperty方法を使用して、1つの属性がインスタンスに存在するかそれともプロトタイプに存在するかを検出することができる.
function Person() {
				
}
Person.prototype.name = "prototype val";
var p1 = new Person();
var p2 = new Person();
p1.name = "object val";
alert(p1.hasOwnProperty("name"));//true
delete p1.name;
alert(p1.hasOwnProperty("name"));//false
 
4.構造モードと原型モードを組み合わせる(デフォルトでは参照タイプを定義するモード)
function Person(name){
    this.name = name;
    this.friends = ["shadow", "parsons"];
}
Person.prototype = {
    constructor: Person,
    say: function(){
         alert(this.name);
    }
};
var person1 = new Person();//  Person
var person2 = new Person();
person1.friends.push("james");
alert(person1.friends);//[shadow, parsons, james]
alert(person2.friends);//[shadow, parsons]
alert(person1.friends == person2.friends);//false
alert(person1.say == person2.say);//true