Similar documents
Microsoft PowerPoint - JavaScript.pptx

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

プログラミング基礎I(再)

Microsoft PowerPoint ppt

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

PowerPoint プレゼンテーション

第7回 Javascript入門

ななちゃんの IT 教室 関数について詳しくなろうの巻 by ななちゃんが JavaScript の関数の使い方を詳しく学ぶというお話 第 0.1 版 2017 年 6 月 18 日 フリー素材

Prog2_12th

JAVA入門

プログラミングI第10回

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

Microsoft PowerPoint - class2-OperatorOverLoad.pptx

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

JavaScriptプログラミング入門 2.JavaScriptの概要

intra-mart Accel Platform — 招待機能プログラミングガイド   初版  

JavaプログラミングⅠ

Microsoft PowerPoint - prog03.ppt

プログラミング入門1

Microsoft PowerPoint - chap10_OOP.ppt

javascript key

Microsoft Word - no06.doc

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

医療者のための情報技術入門第 9 回プログラムがはたらくしくみを学ぶ (2) 日紫喜光良 概要 1. はじめに- 具体例から ここから Javascript のプログラミング入門 次はどうする--

V8.1新規機能紹介記事

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

Prog2_10th

Prog2_10th

ななちゃんの IT 教室 マルチタートルでオブジェクトを理解しようの巻 by 複数のタートルを操作する環境でななちゃんがオブジェクト指向とは何かを勉強します 第 0.7 版 2017 年 5 月 7 日 フリー素材

E4X in Firefox nanto_vi (TOYAMA Nao)

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

メディプロ1 Javaプログラミング補足資料.ppt

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

Javaの作成の前に

16 コピー

Microsoft PowerPoint - ruby_instruction.ppt

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint pptx[読み取り専用]

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

DVIOUT-exer

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

1.JavaScript の関数 JavaScript における関数とはそれ自体が オブジェクト であり 変数やオブジェクトのメンバとして格納したり あるいは 引数としてほかの関数に引き渡したりすることも可能です オブジェクトといって分かりにくければ 関数は JavaScript における データ型

Microsoft PowerPoint - Pro110111

Ruby演習テキスト1

オブジェクト指向プログラミング・同演習 5月21日演習課題

データアダプタ概要

はじめに HTML5 の登場 Web 上で可能な表現や操作の増加 開発まわりも大きく変化 2

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

プログラミング入門1

JavaScript 演習 2 1

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint _2b-DOM.pptx

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

デジタル表現論・第4回

SmartBrowser_document_build30_update.pptx

Microsoft Word - Android_SQLite講座_画面800×1280

デザインパターン第一章「生成《


NetworkApplication-09

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

基礎計算機演習 実習課題No6

Prog2_9th

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

自己紹介 名前 : 一ノ瀬太樹 所属 : HASH コンサルティング株式会社 OWASP Japan プロモーションチーム OWASP ZAP ユーザーグループ脆弱性診断研究会 ( 管理者その 3) Perl 入学式 ( サポーター ) HASH Consult

PowerPoint プレゼンテーション

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

HCI プログラミング 5 回目ウィンドウに画像を表示してみよう 今日の講義で学ぶ内容 画像の表示 画像のエフェクト 画像のビューポート指定 画像の表示 1 画像を表示してみましょう 画像の表示はクラス ImageView により管理されます ソースファイル名 :Sample5_1.java //

Microsoft PowerPoint L07-Imperative Programming Languages-4-students ( )

JavaプログラミングⅠ

CodeGear Developer Camp

Onsen UI について Onsen UI について UI フレームワークとは モバイルアプリを作成する場合 パソコン向けのアプリケーションとは異なり アイコンを多用したり ボタンを指で押しやすいサイズにしたりして 小さな画面の中にアプリの機能を盛り込む工夫が必要です これらをすべて CSS や

PowerPoint プレゼンテーション

コンテンツメディアプログラミング実習2

基本情報STEP UP演習Java対策

JEB Plugin 開発チュートリアル 第4回

科学的モデリング 2 回 継承 2 無断転載 & 無断配布を禁じます 第 2 回 : 科学的モデリング 継承 2 継承される特性( プロパティ ) 第 2 回の話題 継承は何を継承するのか? 今回のコラムの話題は 継承される特性 ( プロパティ ) についてです そもそもサブクラスはスーパークラスか

Prog2_6th

PowerPoint プレゼンテーション

listings-ext

Boost.Preprocessor でプログラミングしましょう DigitalGhost

第 8 回の内容 クライアントサイド処理 JavaScript の基礎

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

C 資料 電脳梁山泊烏賊塾 構造体 C++ の構造体 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する 定義と変数宣言 C++ に

スライド 1

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

Web プログラミング 1 JavaScript (3) (4 章 ) 2013/7/3( 水 ) 日時 講義内容 4/10 ( 水 ) ガイダンス Web (1 章 ) 4/17 ( 水 ) HTML+CSS (1) (2 章 ) 4/24 ( 水 ) HTML+CSS (2) (2 章 ) 5/

ガイダンス

intra-mart Accel Platform — IM-BloomMaker プログラミングガイド   初版  

Java から見たオブジェクト指向入門 オブジェクト指向 AtoZ セミナー ( 株 ) 豆蔵井上樹

Program Design (プログラム設計)

フローチャート自動生成ツール yflowgen の使い方 目次 1 はじめに 本ツールの機能 yflowgen.exe の使い方 yflowgen.exe の実行方法 制限事項 生成したファイル (gml ファイル形式 ) の開

GEC-Java

JavaScript演習

Javaプログラムの実行手順

Transcription:

ios 4% Android 10% Python 1% Design 15% Web(PHP/JS) 10% Windows(C#) 20% 40%

最近のボク お嫁 Web/WordPress Windows Android Design Python Python Android 1% 5% Design Windows 5% 15% お嫁 50% Web/WordPress 25% 2013年6月1日 株式会社フォーエンキー調べ 愛 恐

Simple and Powerfull

var obj = {}

var obj = { } key: value

var f = function() {...}

var obj = { } key: function() {...}

var obj = { } key: function() {...}

( _ )

( _ )

クラス Class (型) new new new クラスという 型 を元にして オブジェクトを生成するイメージ クラスから生成されたオブジェクトは クラスの特性 属性や機能 を受け継ぐ Object 実体 Object 実体 Object 実体

Object (実体) prototype dele gate dele gate dele gate プロトタイプ オブジェクトは 自分自身が備えて いない特性 機能や属性 を 別の オブジェクトにお願い 委譲 する イメージ この時 お願いする先を プロトタイプ と言ったりします Object 実体 Object 実体 Object 実体

var obja = { name : 'Yome', say : function () { alert('i Love ' + this.name); } }; var objb = { name : 'Nikole' }; objb. proto = obja; var objc = { }; objc. proto = objb; objc.say(); I Love Nicole

var obja = { name : 'Yome', say : function () { alert('i Love ' + this.name); } }; var objb = { name : 'Nikole' }; objb. proto = obja; var objc = { }; objc. proto = objb; objc.say();

objc.say objc. proto.say (objb) objc. proto. proto.say (objb) (obja)

objc.name objc. proto.name (objb) objc. proto. proto.say (objb) (obja)

obj. proto. proto.property このように 自分に無い機能や属性を proto に入っている別のオブジェクトから 連鎖的に検索して探す仕組みが

obj. proto. proto.property

var 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 Nikole objc.say(); // I Love Gyu-Ri

class A extends class B extends class C new obj A of B obj A (delegete) obj B (delegete) obj C (delegete) obj D new new obj B of C obj C of C (delegete) obj F (delegete) obj E

あまり見たコトない obj. proto = otherobj 実は proto は標準仕様ではありません つまり proto が利用できない環境もあり だから通常 このようなことはしません ここまでは プロトタイプチェインの概念を分かり易くするために proto を使って 説明していましたが そういうことなので 実際のプログラミングではこんなことしな いでくださいねー ( )/ では 逆に 良く見かけるのは

こっちのが よく見る感じ var o = new Person('Nicole') これは new 演算子とコンストラクタ関数によるオブジェクトの生成です JavaScript におけるオブジェクトの生成で よく見られるコードです このあたりの記法が クラスベースの言語を学んだ方を惑わしますね

var Person = function (name) { this.name = name; } Person.prototype.sayHello = function() { alert('hello ' + this.name); } var person = new Person('Nicole');

var Person = function (name) { } this.name = name; Person.prototype.sayHello = function() { } alert('hello ' + this.name); var person = new Person('Nicole');

var Person = function (name) { } this.name = name; Person.prototype.sayHello = function() { } alert('hello ' + this.name); var person = new Person('Nicole');

var o = new Person('Nicole')

var newobj = {}; newobj. proto = Person.prototype; Person.apply(newObj, arguments); return newobj;

だいたいこんな意味 var newobj = {}; newobj. proto = Person.prototype; ①新しい Object が 生成される Person.apply(newObj, arguments); return newobj; new する度に 新しい個別のオブジェクトが生成されます

だいたいこんな意味 var newobj = {}; newobj. proto = Person.prototype; Person.apply(newObj, arguments); return newobj; ②プロトタイプのオブ ジェクトの参照を代入 コンストラクタ関数の Person.prototype を 新しいオブジェクトの proto に 参照を代入し プロトタイプチェインの仕組みで その特性を継承します

だいたいこんな意味 var newobj = {}; ③ newobj を this に コンストラクタ 関数を実行 newobj. proto = Person.prototype; Person.apply(newObj, arguments); return newobj; これによって コンストラクタ関数の中で 生成される新しいオブジェクトを this と して参照し その属性をセットしたりできるようになります

だいたいこんな意味 var newobj = {}; newobj. proto = Person.prototype; ④完成した オブジェクトを返す Person.apply(newObj, arguments); return newobj; Person.prototype の特性を継承し コンストラクタ関数によって初期化済みの 新しいオブジェクトが返され プログラムで利用できるようになります

newobj. proto = Person.prototype;

整理すると proto プロトタイプチェインで 検索されるプロトタイプ オブジェクトが入ってる プロトタイプチェインで 使われるもの prototype プロトタイプオブジェク トの控え室 new とコンストラクタ 関数でオブジェクトを生 成する時に proto に代入される オブジェクト生成で 使われるもの

(function() { var Person = 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 })();

(function() { var Person = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('i Love ' + this.name); }; Person: { prototype: { name:'nanashi' say: functon () { } } } 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();

(function() { var Person = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('i Love ' + this.name); }; Person: { prototype: { name:'nanashi' say: functon () { } } } var p = new Person('Nicole'); alert( p. proto === Person.prototype ); p.say(); p.name = 'Gyu-Ri'; p.say(); var newobj = {}; newobj. proto = Person.prototype.name = 'Ha-Ra'; p.say(); delete p.name; p.say(); Person.apply(newObj, ['Nicole']) return newobj; })();

(function() { var Person = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('i Love ' + this.name); }; Person: { prototype: { name:'nanashi' say: functon () { } } } 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(); p: { name:'nicole' proto : } })();

(function() { var Person = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('i Love ' + this.name); }; Person: { prototype: { name:'nanashi' say: functon () { } } } 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(); p: { name:'nicole' proto : } })();

(function() { var Person = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('i Love ' + this.name); }; Person: { prototype: { name:'nanashi' say: functon () { } } } 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(); p: { name:'nicole' proto : } })();

(function() { var Person = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('i Love ' + this.name); }; Person: { prototype: { name:'nanashi' say: functon () { } } } 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(); p: { name:'gyu-ri' proto : } })();

(function() { var Person = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('i Love ' + this.name); }; Person: { prototype: { name:'ha-ra' say: functon () { } } } 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(); p: { name:'gyu-ri' proto : } })();

(function() { var Person = function (name){ this.name = name; }; Person.prototype.name = 'nanashi'; Person.prototype.say = function () { alert('i Love ' + this.name); }; Person: { prototype: { name:'ha-ra' say: functon () { } } } 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(); p: { name:'gyu-ri' proto : } })();

function myfunc() { } var name = 'Gyu-Ri'; myfunc(); alert(name); //ReferenceError

var a = 123; function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); //738 } } func2(); func1();

var name = 'Nicole'; function myfunc() { var name = 'Gyu-Ri'; } myfunc(); alert(name); //Nicole

var name = 'Nicole'; function myfunc() { name = 'Gyu-Ri'; } myfunc(); alert(name); //???

var name = 'Nicole'; function myfunc() { } name = 'Gyu-Ri'; myfunc(); alert(name); //Gyu-Ri

var name = 'Nicole'; function myfunc() { Before var name = 'Gyu-Ri'; }

var name = 'Nicole'; function myfunc() { After name = 'Gyu-Ri'; }

var name = 'Nicole'; function myfunc() { var name = 'Gyu-Ri'; var }

var a = 123

var a = 123; function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } } func2(); func1(); //738

var a = 123; function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } } func2(); func1(); //738

var a = 123; function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } } func2(); func1(); //738

var a = 123; function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } } func2(); func1(); //738

scope.a (func2) scope. scope.a (func2) (func1) scope. scope. scope.a (func2) (func1) (global)

scope. scope. scope.identifier このように 今のスコープに無い識別子を より外側のスコープから連鎖的に 検索して探す仕組みが

scope. scope. scope.identifier

余談ですが 実はJavaScriptでは 変数のスコープでさえも 内部的にはオブジェクトで構成されています 変数オブ ジェクト つまり つまるところ スコープチェイン も プロトタイプチェイン も オブジェクトの特 殊なプロパティによる連結リストによるデータ構造と それを終端に向かって連鎖的に検索するという よく 似たシンプルな仕組みに過ぎません またこれは JavaScriptにおけるスコープの実体が グローバルスコー プ グローバル変数オブジェクト をrootとする 変数オブジェクトが連なった巨大なオブジェクトのツ リー構造だということでもあります 興味深いですね 残念ながら それらのスコープを構成するオブジェクトのツリーを プログラマが直接参照することは出来ま せん しかし プロトタイプチェインを構成する proto 属性については ECMA Script標準では無いも のの 幾つかのブラウザ実装では実際に目にしてその仕組みを確認することが出来ます これを良く観察す ることで スコープチェイン と プロトタイプチェイン 両方の理解を深めることが出来るはずです

var a = 123; function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } ( ) } func2(); func1(); //738

var a = 123; function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } } func2(); func1(); //738

var a = 123; function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } } func2(); func1(); //738

var a = 123; function func1() { var b = 3; function func2() { var c = 2; alert(a * b * c); } } func2(); func1(); //738

var Person = (function($) { var privatevalue = 'Hogeta'; function Person(name) {... } Person.prototype.xxxx =... return Person; })(jquery);

function newcounter() { } var i = 0; return function() { } i = i + 1; return i; var c1 = newcounter(); alert(c1()); // 1 alert(c1()); // 2 alert(c1()); // 3

var Person = function (name) { this.name = name; } Person.prototype.sayHello = function() { alert('hello ' + this.name); } var person = new Person('Nicole'); var btn = $('button#say-hello'); btn.on('click', function() { person.sayhello(); });

var Person = function (name) { this.name = name; } Person.prototype.sayHello = function() { alert('hello ' + this.name); } var person = new Person('Nicole'); var btn = $('button'); btn.on('click', person.sayhello);

var obj = { } key: function() {...}

person sayhello btn.on('click', person.sayhello);

sayhello btn.on('click', person.sayhello);

person.sayhello();

...nothing... sayhello();

function sayhello() { alert('hello ' + this.name); } sayhello(); global object = window 関数のコール時にレシーバーが無い時 this はグローバルオブジェクトになります ブラウザ実装の場合 これは通常 window オブジェクトです

call apply bind

call(object, arg1, arg2,...) apply(object, Array) bind(object, arg1, arg2,...)

call apply

call の例 function say(arg1, arg2) { alert(arg1 + this.name + arg2); } var person = new Person('Nicole'); say.call(person, 'Hello ', ' chan'); person を this として実行 call の第1引数が this に 第2引数以降の引数が say関数の引数に

apply の例 function say(arg1, arg2) { alert(arg1 + this.name + arg2); } var person = new Person('Nicole'); say.apply(person, ['Hello ', ' chan']); person を this として実行 call の第1引数が this に 第2引数の 配列の内容が say関数の引数になる 引数の渡し方以外は call と同じ

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');

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');

bind

function say(arg1, arg2) { alert(arg1 + this.name + arg2); } var person = new Person('Nicole'); var say2 = say.bind(person); say2('hello ', ' chan');

bind

var Person = function (name) { this.name = name; } Person.prototype.sayHello = function() { alert('hello ' + this.name); } var person = new Person('Nicole'); var btn = $('button'); btn.on('click', person.sayhello);

var Person = function (name) { this.name = name; } Person.prototype.sayHello = function() { alert('hello ' + this.name); } var person = new Person('Nicole'); var btn = $('button'); btn.on('click', person.sayhello.bind(person));

apply

// this function bind (self, func) { return function () { return func.apply(self, arguments); }; } // function Person (name) { this.name = name; this.say = bind(this, this.say); } Person.prototype.say = function (prefix) { alert(prefix + this.name); } // var person = new Person('Nicole'); // nicole.say('i Love '); // I Love Nicole // OK settimeout(person.say.bind(null, 'I Just Realy Love to '), 2000);

var obj = {}

@yuka2py http://www.amazon.co.jp/dp/4798129682