1.オブジェクトクラス
JS では、Object はすべてのクラスの基本クラスです。Object クラスを使用してカスタム オブジェクトを作成する場合、コンストラクター (constructor、prototype、hasOwnProperty(property)) を定義する必要はありません。
var per = new Object(); per.name = 'zhangsan'; per.age = ; alert(per.name + per.age);
大量のデータを格納できるオブジェクト変数をプログラム内で取得したい場合は、Object クラスの使用を検討できます。 Object クラスはコンストラクターの定義を回避します。 Object クラスでよく使用されるもう 1 つのプロパティ: hasOwnProperty
var per = new Object(); per.name = 'zhangsan'; per.age = ; if per.hasOwnProperty('email'){ alert('具有email'); }else{ alert('无email'); }
2. 静的属性
一部のオブジェクト指向言語では、static キーワードを使用して、JS でシミュレートできるクラスの静的プロパティまたは静的メソッドを定義できます。
構文:
クラス名.属性名
クラス名.Attribute=function(){}
function Person(){ } Person.count = ; var p = new Person(); Person.count++; var p = new Person(); Person.count++; var p = new Person(); Person.count++; alert(Person.count);
静的プロパティと静的メソッドを追加します:
function Person(){ Person.count++; //静态属性 Person.getCount=function(){ //静态方法 alert('当前共有' + Person.count + '个人'); } } Person.count = ; var p = new Person(); var p = new Person(); var p = new Person(); Person.getCount();
3. 終了
概念: いわゆるクロージャは、多くの変数とこれらの変数にバインドされた環境を持つ式 (通常は関数) を指します。したがって、これらの変数も式の一部です。
質問する:
function display(){ var i=; } display(); //在这里,想访问局部变量i
グローバル世界ではスコープが異なるためローカル変数 i にアクセスできず、表示関数実行後にローカル変数 i が再利用されます。 クロージャの機能: 「ローカル変数にアクセスする」および「変数によって占有されているメモリが解放されないようにする」
//例 function fn(){ function fn(){ alert('hello'); } return fn; //返回fn函数首地址 } var test=fn(); //test也指向了fn函数的首地址 test();
例 1 を通じて、変数が関数の最初のアドレスを指すことができ、関数が別の関数の最初のアドレスを返すこともできることがわかりました。
//例 function fn(){ var i = ; function fn(){ alert(i); } return fn; //返回fn函数首地址 } var test=fn(); //test也指向了fn函数的首地址 test();
例 2 からわかるように、ローカル変数 i のメモリが再利用されないように、reject 関数を使用して変数 i をインクルードします。
//例 function fn(){ var i = ; function fn(){ alert(i++); } return fn; //返回fn函数首地址 } var test=fn(); //test也指向了fn函数的首地址 test(); test(); test();
例 3 では、i のメモリは決して再利用されないため、fn2 が呼び出されるたびに i の値は +1 されます。操作の結果は、10 がポップアップし、11 がポップアップし、12 がポップアップします。
クロージャーの原則: 例 3 には、グローバル スコープ、fn1 スコープ、fn2 スコープの 3 つのスコープがあります。実際、グローバル スコープには test=fn1() があります。この文は test=fn2 と同等です。 fn1 スコープには var i=10 と return fn2 があり、fn2 スコープにはalert(i++) があります。グローバルスコープのtest=fn1()を実行すると、testはfn2のスコープを指しますが、このときfn2スコープのiはグローバルスコープにフックされます。iは定義されません。 fn2 の下で i の上位スコープを調べたところ、 fn1 スコープで var i=10 が見つかりました。したがって、グローバル テストは fn2 の i をフックし、fn2 の i は fn1 の i をフックするため、fn1 は実行後にリサイクルされません。
4. プライベート属性
オブジェクト指向の考え方では、公開されたくない一部の機密メンバーをプライベートとして定義でき、この機能を JavaScript でシミュレートできます。
構文:
function Person(p_name){ var name = p_name; this.age }
変数: プライベート
これ: 公開
function Person(p_name,p_age){ this.name = p_name; var age = p_age; } var p = new Person('zhangsan',); alert(p.name); alert(p.age);
上記の例では、var を使用してプライベート メンバー プロパティを表現したいと考えていますが、Person コンストラクターの実行後、age はリサイクルされるため、メンバー プロパティとして使用できません。
function Person(p_name,p_age){ this.name = p_name; var age = p_age; this.setAge=function(a){ age = a; } this.getAge=function(){ return(age); } } var p = new Person('zhangsan',); p.setAge(); alert(p.getAge());
this.setAge と this.getAge の 2 つのメソッドはローカル変数 age を使用するため、age はリサイクルされません。
set メソッドのみがある場合、その属性は書き込み専用属性であることを意味します。
get メソッドのみがある場合、その属性は読み取り専用属性であることを意味します。
5. 電話と申し込みの利用
call と apply の関数: 指定されたオブジェクトを使用して現在の関数を呼び出します。 call と apply の関数はまったく同じですが、構文が少し異なります。
構文:
call([thisObj[,arg1[,arg2[,argN]]]])
最初のパラメータ: 関数の実行時にこれが指す人
以降のパラメータ: 必要に応じて
を順番に指定しますapply([thisObj[,argArray]])
最初のパラメータ: 関数の実行時にこれが指す人
2 番目のパラメータ: パラメータセットを示す配列
js では、関数にはいくつかの呼び出し形式があります。
Person(); //Person内的this指向window var p=new Person(); //Person内的this指向p per.Person(); //Person内的this指向per function Person(p_name,p_age){ this.name = p_name; this.age = p_age; } function speak(){ alert(this.name + this.age); } var p = new Person('zhangsan',); //speak(); 这样调用this指向window //p.speak(); p对象没有speak属性
通話を使用して通話を申し込む
function Person(p_name,p_age){ this.name = p_name; this.age = p_age; } function speak(){ alert(this.name + this.age); } var p = new Person('zhangsan',); speak.call(p); speak.apply(p);
call と apply は、実行時に 2 つのことを行います: 1) 関数内の this を最初のパラメーターにポイントします 2) 関数
を呼び出しますまた: この問題は次のように解決することもできます:
P1.say=speak;
P1.say();
このソリューションは上記のソリューションとは根本的に異なります:
上記の解決策は、speak 関数を直接呼び出すことですが、関数内の this のポインタが変更されます。
次の解決策は、p1 オブジェクトに属性を追加し、p1 オブジェクトの「ボリューム」が大きくなります。
例:
<script> function fn(){ this.style.color='red'; } function fn(){ this.style.fontSize='px'; } window.onload=function(){ document.getElementById('btn').onclick=function(){ var div = document.getElementById('div'); fn.call(div); fn.apply(div); }; }; </script> <div id='div'>hello javascript</div> <input type='button' id='btn' value='确定'>
6.继承的三种实现方法
概念:在有些面向对象语言中,可以使用一个类(子类)继承另一个类(父类),子类可以拥有父类的属性和方法,这个功能可以在js中进行模拟。
三种方法:
第一种:扩展Object方法
Object.prototype.方法=function(父类对象){ for(var i in 父类对象){ this[i] = 父类对象[i]; } };
举例说明:
Object.prototype.ext=function(parObject){ //循环遍历父类对象所有属性 for(var i in parObject){ //为子类对象添加这个遍历到的属性 //它的值是父类对象这个属性的属性值 this[i] = parObject[i]; } } function Person(p_name,p_age){ this.name=p_name; this.age=p_age; this.speak=function(){ alert(this.name+this.age); } } function Student(p_no){ this.no=p_no; this.say=function(){ alert(this.no+this.name_this.age); } } var stu = new Student(); stu.ext(new Person('xiaoqiang',)); stu.speak(); stu.say();
第二种:使用call和apply方法
语法:
父类构造器.call(this,.......);
function Person(p_name,p_age){ this.name=p_name; this.age=p_age; this.speak=function(){ alert(this.name+this.age); } } function Student(p_no,p_name,p_age){ this.no=p_no; this.say=function(){ alert(this.name+this.age+this.no); } Person.call(this,p_name,p_age); } var stu = new Student(,'zhagsan',); stu.speak(); stu.say();
第三种:原型继承
语法:
子类.prototype = new 父类();
function Person(p_name,p_age){ this.name=p_name; this.age=p_age; this.speak=function(){ alert(this.name+this.age); } } function Student(p_no){ this.no=p_no; this.say=function(){ alert(this.name+this.age+this.no); } } Student.prototype = new Person('wangwu',); var stu = new Student(); stu.speak(); stu.say();
以上内容给大家介绍了JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法,希望对大家有所帮助!