Javascript は厳密なオブジェクト指向言語ではなく、オブジェクト駆動型およびイベント駆動型プログラミングに基づくクライアント側のスクリプト言語です。理由: オブジェクト指向には、カプセル化、継承、ポリモーフィズムという 3 つの主要な機能が含まれていますが、JavaScript にはカプセル化のみがあり、継承は継承をシミュレートするだけであり、オブジェクト指向ではありません。
このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
Javascript は厳密なオブジェクト指向言語ではなく、オブジェクト駆動プログラミングに基づくクライアント側スクリプト言語であり、オブジェクトを作成するだけでなく、既存のオブジェクトを使用することもできます。
なぜ JavaScript はオブジェクト指向言語ではないのですか?
オブジェクト指向には、カプセル化、継承、ポリモーフィズムという 3 つの大きな特徴があるからです。 JavaScript にはカプセル化のみがあり、継承はシミュレートされた継承のみであり、オブジェクト指向ではありません。
つまり、JavaScript ではすべてがオブジェクトであり、プロパティ、配列、関数などはすべてオブジェクトです。
JavaScript にはオーバーロードはありません
JavaScript にはオーバーロードはありません。同じ関数後で定義された名前は前の関数を上書きし、常に最後の関数のみを呼び出します。JS の仮パラメータは単なるプレースホルダーです。2 つの仮パラメータを定義する場合、プログラマが実際のパラメータを渡しやすくするためだけに、渡すことができるパラメータは 1 つだけです。 。
仮パラメータが記述されていない場合、実パラメータをプレースホルダとして便利に使用することはできません。この場合、暗黙の仮パラメータarguments[0]は、最初の実パラメータとarguments[1]にアクセスするために使用されます。 2 番目の実パラメータへのアクセスなどに使用されます。
関数を使用してクラスをシミュレートする
通常、クラス名の最初の文字は大文字で始まります。クラスの定義、2. メソッド の属性値は関数です。
例:
<script type="text/javascript"> function Student (sno,sname,age) { this.sno = sno; this.sname = sname; this.age = age; this.study = function(){ alert('我是'+this.sname+',我在学习') } } var stu = new Student(1,'xiaoming',20); stu.study(); </script>
オブジェクト クラスを使用してインスタント オブジェクトを作成する
delete stu.name;//可以删除属性
例:
<script type="text/javascript"> var stu = new Object(); stu.sno = 1; stu.sname = 'xiaoming'; stu.age = 20; stu.study = function(){ alert('我是'+this.sname+',我在学习'); } stu.study(); </script>
シミュレーションの継承
1. call() 関数を使用して継承をシミュレートします
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> function Person (name,age) { this.name = name; this.age = age; this.eat = function(){ alert('姓名:'+this.name+",年龄:"+this.age+",我在吃饭"); } } function Student(sno,name,age){ Person.call(this,name,age);//相当于super(name,age) this.sno = sno; this.study = function(){ alert('学号:'+this.sno+',姓名:'+this.name+",年龄"+this.age+",我在学习"); } } var stu = new Student(1,'xiaoming',22); stu.eat(); stu.study(); </script> </head> <body> </body> </html>
2. apply() 関数を使用して継承をシミュレートします
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> function Person (name,age) { this.name = name; this.age = age; this.eat = function(){ alert('姓名:'+this.name+",年龄:"+this.age+",我在吃饭"); } } function Student(sno,name,age){ Person.apply(this,[name,age]);//相当于super(name,age) this.sno = sno; this.study = function(){ alert('学号:'+this.sno+',姓名:'+this.name+",年龄"+this.age+",我在学习"); } } var stu = new Student(1,'xiaoming',22); stu.eat(); stu.study(); </script> </head> <body> </body> </html>
3. プロトタイプを使用する プロトタイプは継承をシミュレートします
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> function Person (name,age) { this.name = name; this.age = age; this.eat = function(){ alert('姓名:'+this.name+",年龄:"+this.age+",我在吃饭"); } } function Student(sno,name,age){ this.sno = sno; this.name = name; this.age = age; this.study = function(){ alert('学号:'+this.sno+',姓名:'+this.name+",年龄"+this.age+",我在学习"); } } //1.创建父类对象 var person = new Person(); //2.子类.prototype = person; Student.prototype = person; //把父类的原型赋值给子类的原型,原型一致,模拟实现了继承。 //但是会丢失子类的属性值,全变成了undefined,即使new 对象时加上了,也不起作用 //打脸,xiaoming既吃饭也学习 var stu = new Student(1,'xiaoming',20); //动态的添加方法,即使在new对象之前没有这个方法 Student.prototype.test = function() { alert('test动态添加方法'); } stu.eat(); stu.study(); stu.test(); </script> </head> <body> </body> </html>
クラスのプロトタイプ属性を通じて、クラスがどのような属性とメソッドを持っているかを知ることができます。
//1.创建父类对象 var person = new Person(); //2.子类.prototype = 父类对象 Student.prototype = person ; //把父类的原型赋值给子类对象的原型,原型一致,模拟实现了继承。
【関連する推奨事項: JavaScript 学習チュートリアル】
以上がJavaScriptはオブジェクト指向ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。