同じプロトタイプを所有すればOKvar objA ={name : 'Yome',say : function () {alert('I Love ' + this.name);}};var objB = { name : 'Nikole' };objB.__proto__ = objA;var objC = { name : 'Gyu-Ri' };objC.__proto__ = objA;objB.say(); // I Love NikoleobjC.say(); // I Love Gyu-Ri
‣ クラスベース ‣プロトタイプベースclass Aclass Bclass Cobj Aobj Bobj Cobj A of Bobj B of Cobj C of Cobj Eobj Fextendsextends(delegete)newnew(delegete)オブジェクトだけの世界クラスからオブジェクトを作成obj D(delegete)new(delegete)(delegete)クラスベースではクラスという型を拡張し、そこからインスタンスを作成するイメージです。一方プロトタイプベースでは、必要な特性を持った他のオブジェクトを利用するイメージです。
(function() { varPerson = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('I Love ' + this.name); }; var p = new Person('Nicole'); alert( p.__proto__ === Person.prototype ); // true p.say(); // I Love Nicole p.name = 'Gyu-Ri'; p.say(); // I Love Gyu-Ri Person.prototype.name = 'Ha-Ra'; p.say(); // I Love Gyu-Ri delete p.name; p.say(); // I Love Ha-Ra})();SAMPLECODE
79.
(function() { varPerson = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('I Love ' + this.name); }; var p = new Person('Nicole'); alert( p.__proto__ === Person.prototype ); p.say(); p.name = 'Gyu-Ri'; p.say(); Person.prototype.name = 'Ha-Ra'; p.say(); delete p.name; p.say();})();Person: {prototype: {name:'nanashi'say: functon () {…}}}この準備で、右側のようなオブジェクトが出来ます(コンストラクタ関数の実行部は省略)。ここで、Person.prototype に入っているオブジェクトは、nameと say の2つの属性を持ちます。
外側の変数は見えるvar a =123;function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } func2();}func1(); //738と表示さっきの例の変数 a の場合
111.
このローカルスコープで、宣言されているのは c だけなので、aと b は 既にあると解釈される…でも、func2 のローカルスコープには、a と b は見つからない。var a = 123;function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } func2();}func1(); //738と表示
112.
var a =123;function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } func2();}func1(); //738と表示そこで JavaScript は、一つ外側の func1 のスコープで a と b を検索する。そして、b を見つけるが、まだ a は見つからない。
113.
var a =123;function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } func2();}func1(); //738と表示そこで JavaScript は、さらに外側のスコープで a を検索し、そして a を発見する。
var a =123;function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } func2();}func1(); //738と表示この関数が定義された環境とは…
130.
var a =123;function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } func2();}func1(); //738と表示この関数を含む全てのスコープのことスコープチェインによって、関数定義の外側の変数まで参照できましたよね!
person を thisとして実行callの第1引数が this に、第2引数以降の引数が、say関数の引数に。function say(arg1, arg2) { alert(arg1 + this.name + arg2);}var person = new Person('Nicole');say.call(person, 'Hello ', ' chan');call の例
170.
person を thisとして実行applyの例call の第1引数が this に、第2引数の配列の内容が、say関数の引数になる。引数の渡し方以外はcall と同じfunction say(arg1, arg2) { alert(arg1 + this.name + arg2);}var person = new Person('Nicole');say.apply(person, ['Hello ', ' chan']);
171.
他のオブジェクトのメンバだったら?var p1 ={name: 'Gyu-Ri',say: function (arg1, arg2) { alert(arg1 + this.name + arg2);}};var person = new Person('Nicole');p1.say.call(person, 'Hello ', ' chan');
172.
他のオブジェクトのメンバでも関係ない関数はオブジェクトに「束縛されていない」ことを思い出してください。ここで、関数 say がp1 に属していても、指定した person が this になります。var p1 = {name: 'Gyu-Ri',say: function (arg1, arg2) { alert(arg1 + this.name + arg2);}};var person = new Person('Nicole');p1.say.call(person, 'Hello ', ' chan');