JavaScript 関数、オブジェクトの作成、カプセル化、プロパティとメソッド、inheritance_javascript スキル
1. 関数
js に触れた当初からとても柔軟に感じます。例えば、関数
の書き方は N 種類あります。 例: function showMsg(){ }, var showMsg=function( ){}, showMsg=function(){}
違いはないようですが、本当に同じですか?
///-------- ------------ -------------------------------------- ------------ -------
-------
//関数定義: 名前付き関数 (宣言型)、匿名関数 (参照式)
//宣言型、関数実行コードの前に定義コードが解析されます。
function t1(){
dwn("t1"); >}
t1();
function t1(){
dwn("new t1")
}
//実行中に動的に解析される参照型関数操作
var t1=function (){
dwn("新しい新しい t1");
}
t1();
var t1=function(){
dwn( "new new new t1");
}
t1()
//上記の出力: new t1、new t1、new new t1
おそらく出力 t1、new t1、new newt1、new new new t1 になるはずですが、結果は次のようなものではないことを理解してください: 宣言
式、定義コードは関数の前に解析されます。実行コード
もう一歩深く言えば、スコープチェーンの問題と言えます。実際、最初の 2 つのメソッドは window.t1 に相当します。t1 は window のパブリック プロパティに割り当てられていることがわかります。 >後の 2 つのメソッドは t1 が変数であると理解でき、var を削除した後の 4 番目のメソッドの結果は変わりません
ただし、4 番目のメソッドの場合はfunction t1(){} のような文に変更されます。式を実行すると、結果は new new new t1,new new new
t1,new new t1,new new t1
私の理解によれば、最初の 2 つは、この答えがなぜそうなのかよく理解できます。 3 つ目も理解できますが、最後の出力は
よりも混乱します。それに答えられる専門家がいることを願っています
さらに、 (function(){...})() などの匿名関数 書き方としては、最後の括弧がパラメータ入力
に使われており、var t1=new function(){..} のような記述があります。実際、t1 はすでにオブジェクトです
例:
コードをコピー
alert (typeof(t2)) //object
alert(t2.constructor()); >さらに、システム組み込み関数オブジェクトを使用して関数を構築することもできます。例:
var t3 = new Function('var temp = 100; this.temp = 200; return temp this.temp ;'); //この位置に new が追加されているかどうかに関係なく、結果は同じです。なぜ
alert(typeof(t3)) //function
alert(t3()); 🎜>
2 番目に、オブジェクトを作成します
まず、オブジェクト指向プログラミング (OOP) について理解します。OOP テクノロジでは、多くの
コード モジュールが使用されます。各モジュールは、それぞれ特定の機能を提供します。他のモジュール
から隔離されているか、完全に独立している場合もあります。このモジュール式プログラミングのアプローチにより、優れた多様性が提供され、コードを再利用する機会が大幅に増加します。この問題
をさらに詳しく説明するために、コンピューター上の高性能アプリケーションが一流のレーシング カーであると仮定します。従来のプログラミング手法を使用すると、自動車は
単一ユニットになります。車を改善したい場合は、ユニット全体を交換するか、メーカーに送り返して車の専門家にアップグレードしてもらうか、新しい
車を購入する必要があります。 OOP テクノロジーを使用すると、弓のこで車体を切断する必要がなく、メーカーから新しいエンジンを購入し、指示に従って自分で交換するだけで済みます。
しかし、議論のほとんどは、JavaScript は直接的なオブジェクト指向言語ではないが、シミュレーションを通じてオブジェクト指向言語が実行できる多くのこと (継承など) を実行できるというものです。
ポリモーフィズム、カプセル化、JavaScript ならできます (不可能ではありません。思いつかないだけです)
コードをコピー
コードは次のとおりです:
function Point(x,y){ //C# クラスと同様
this.x=x;
}
var p=new Point(1, 2); //クラスをインスタンス化します
最初のメソッドは、基本オブジェクトを構築し、属性を直接追加することによって実装されます。2 番目のメソッドは、最初のメソッドと同様であり、最初のメソッドのショートカット表現とみなすことができます。
3 番目の方法では、「クラス」に基づいて同じタイプの複数のオブジェクトを作成できます
3. オブジェクト属性 (パブリックおよびプライベート) のカプセル化
例付きの図
function List (){
var m_elements=[]; //ここで var 宣言がない場合は、m_elements がグローバル変数
になり、alert などの外部から直接アクセスできます。 (m_elements[0])
m_elements=Array .apply(m_elements,arguments);
//使用時にゲッターをシミュレートします。 alist.length;
//getName() メソッドと同等: this.length=function(){return m_elements .length;},使用時
alist.length();
//パブリック プロパティには、「.」演算子または添え字
this.length={
valueOf:function(){
return m_elements.length;
},
toString:function(){
return m_elements.length;
}
}
//このメソッドは、alert( alist) は、alert(alist.toString()) と同等です。
this.toString=function(){
return m_elements.toString();
}
// パブリック メソッド
this .add=function(){
m_elements.push.apply(m_elements,arguments);
}
//プライベートメソッドはクロージャの概念を含む次の形式です。続きの説明を続けましょう
//var add=function() または function add()
//{
//m_elements.push.apply(m_elements,arguments)
//}
}
var alist=new List(1,2,3);
dwn(alist); //=alert(alist.toString())、出力 1,2,3
dwn(alist.length); //出力 3
alist.add(4,5,6);
dwn(alist); //出力 1,2,3,4,5,6
dwn(alist.length); //出力 6
4. プロパティとメソッドの種類
JavaScript では、オブジェクトのプロパティとメソッドは、プライベート プロパティ (プライベート プロパティ)、動的パブリック
の 4 つの異なるタイプをサポートします。プロパティ (動的パブリック プロパティ)、静的パブリック プロパティ/プロトタイプ プロパティ (静的パブリック プロパティまたはプロトタイプ プロパティ)、
静的プロパティ (静的プロパティまたはクラス プロパティ)。プライベート プロパティは外部からは完全にアクセスできず、内部ゲッターと
セッターを介してアクセスできます (どちらもシミュレーションです)。動的パブリック プロパティは外部からアクセスでき、各オブジェクト インスタンスはコピーを保持します。相互に影響しません。プロトタイプ
の属性は、各オブジェクト インスタンスと一意のコピーを共有します。インスタンスの属性としては使用されず、クラスの属性としてのみ使用されます。
以下は例です:
///-- ------------------------------------------- ----- -------------------------------------
-- ----
//動的パブリック型、静的パブリック型 (プロトタイプ プロパティ)
function myClass(){
var p=100; //プライベート プロパティ
this.x=10; /dynamic public property
}
myClass.prototype.y=20; //static public プロパティまたはプロトタイプ プロパティ。
プロパティを myClass のプロトタイプに動的に追加し、インスタンス化されたすべてのオブジェクトに適用されます。ここではプロトタイプが使用されていることに注意してください。これは非常に便利です。
//高度な JavaScript ステージになるには、プロトタイプとクロージャーを理解し、適切に適用する必要があります。
myClass.z=30; //static property
var a=new myClass();
dwn(a.p) //未定義
dwn(a.x) //10
dwn(a.y) //20
a.x=20; 🎜>a.y=40;
dwn(a.x); //20
dwn(a.y); // オブジェクト a の属性 x を削除します。 a.y); //オブジェクト a の属性 y を削除します
dwn(a.x); //未定義
dwn(a.y); //20 静的パブリック属性 y をプロトタイプ属性 y
dwn に戻します(削除後 a.z); //未定義のクラス属性にはオブジェクトを通じてアクセスできません
5. プロトタイプ (prototype)
の一部のみです。ここで説明する、プロトタイプとクロージャは両方ともです。これは、ほんの数語で明確に説明できるものではありません。これがあなたに何らかの啓発を与えることができれば、あなたは幸運です
「猫を撮って虎を描く」という慣用句のように、ここでの猫はプロトタイプ、トラはタイプであり、次のように表現できます: Tiger.prototype=someone cat または
プロトタイプのプロパティは固有のオブジェクト インスタンスごとにコピーします。インスタンスの 1 つがプロトタイプ プロパティの値を調整すると、すべてのインスタンスが調整されます
この属性を使用するたびに、これに注意する必要があります
次は型チェーンですプロトタイプ関係の:
コードをコピー
関数 ClassA(){
}
ClassA.prototype=new Object();
関数 ClassB(){
}
ClassB.prototype=new ClassA() ;
function ClassC(){
}
ClassC.prototype=new ClassC();
var obj=new ClassC(); //true
dwn(objinstanceofClassB); //true
dwn(objinstanceofObject); //true
デフォルト値のポイントオブジェクト:
function Point2(x,y){
if (x) this.x=x;
if (y) this.y=y;
}
//Point2 オブジェクトの x を設定します、y のデフォルト値は 0 です
Point2.prototype.x=0
//p1 はデフォルト (0,0) オブジェクトです
var p1 = new Point2(); //var p1=new Point2 はエラーなく書けますが、なぜ
//P2 割り当て
var p2=new Point2(1,2); ," p1.y); //0,0
dwn(p2.x "," p2.y); //1,2
オブジェクトのプロパティを削除すると、プロトタイプのプロパティは に戻ります。初期化された状態:
function ClassD(){
this.a=100;
this.c=300
}
ClassD.prototype=new ClassD() ; //その値を含む、ClassD の元のプロパティをプロトタイプとして設定します
ClassD.prototype.reset=function(){ //(この中の var each) の非プロトタイプ プロパティを削除します{
これを削除します
}
}
var d=new ClassD()
d.a); //100
d.a*=2; >d.b*= 2;
dwn(d.a) //400
dwn(d.c); d.reset( ); //非プロトタイプ属性を削除し、すべてのプロトタイプを返します。
dwn(d.b); //200
dwn(d.c);
6. 継承
2 つのクラスが同じインスタンス型である場合、それらの間には特定の関係が存在します。
その関係。を継承といいます。これは C# と JAVA の両方で利用できるため、具体的な理解には立ち入りません。
JavaScript ではメソッドからの継承は直接サポートされていませんが、前述したように、メソッドは構築継承、プロトタイプ継承、インスタンス継承、コピー継承の 4 つのタイプに要約できます。マスターした後は、混合継続
方法もあります。これは何ですか? 前の 4 つからいくつかを選択して混合する方法です。
次の例は、Return of the King からのものです。これには、apply、call などが含まれます。Array の使用法に興味がある場合は、庭
1 で
コードをコピー
コードは次のとおりです:
//コレクション型を定義します
関数 Collection(size)
{
{
var m_elements = []; //プライベートメンバーは継承できません
m_elements = Array.apply(m_elements, argument);
//ArrayList 型はコレクションを継承します
this.base = Collection ;
this.base.call(this, m_elements.length );
this.add = function()
{
return m_elements.push.apply(m_elements, argument); 🎜>}
this.toArray = function()
{
return m_elements;
}
}
ArrayList.prototype.toString = function()
{
return this.toArray().toString();
}
//ArrayList 型を継承する SortedList 型を定義します。
関数 SortedList()
{
// SortedList 型は ArrayList を継承します。
this.base = ArrayList;
this.sort = function()
{
var arr = this.toArray();
arr.sort.apply(arr, argument);
}
}
//ArrayList を構築します
var a = new ArrayList(1, 2,3);
dwn(a);
dwn (a.size()); //a は Collection
dwn(a.isEmpty) から継承します。 isEmpty() メソッドを継承しません
//SortedList を 1 つ作成します
var b = new SortedList(3,1,2); //b ArrayList から add() メソッドを継承
dwn(b.toArray() ); //b ArrayList から toArray() メソッドを継承
b.sort() メソッド
dwn(b.toArray());
dwn(b );
dwn(b.size()); //b はコレクション
から継承します🎜>2、プロトタイプ継承の例:
コードをコピー
コードは次のとおりです:
//Define a Point type
function Point(dimension)
{
this.dimension = dimension;
}
//Define a Point2D type, "inherits" Point type
function Point2D(x, y)
{
this.x = x;
this.y = y;
}
Point2D.prototype .distance = function()
{
return Math.sqrt(this.x * this.x this.y * this.y);
}
Point2D.prototype = new Point(2) ; //Point2D inherits Point
//Define a Point3D type and also inherits Point type
function Point3D(x, y, z)
{
this.x = x;
this.y = y;
this.z = z;
}
Point3D.prototype = new Point(3); //Point3D also inherits the Point
//construction A Point2D object
var p1 = new Point2D(0,0);
//Construct a Point3D object
var p2 = new Point3D(0,1,2);
dwn( p1.dimension);
dwn(p2.dimension);
dwn(p1 instanceof Point2D); //p1 is a Point2D
dwn(p1 instanceof Point); //p1 is also a Point
dwn(p2 instanceof Point); //p2 is a Point
The above two methods are the most commonly used
3, instance inheritance method example:
Before talking about this method example, Let’s talk about the limitations of the construction inheritance method, as follows:
function MyDate ()
{
this.base = Date;
this.base.apply(this, arguments);
}
var date = new MyDate();
alert(date .toGMTString); //undefined, date does not inherit from the Date type, so there is no toGMTString method
Some methods of the core object cannot be inherited by the constructor because the core object is not as customized as ours How about
performing assignment or initialization operations
in the constructor like a normal object and replacing it with prototypal inheritance? , as follows:
function MyDate(){}
MyDate.prototype=new Date();
var date=new MyDate();
alert(date.toGMTString); //'[object]' is not a date object, and it still does not inherit the Date type!
Now, switch to instance inheritance:
function MyDate()
{
var instance = new Date(); //instance is a newly created date object
instance.printDate = function(){
document. write("
" instance.toLocaleString() "
");} //Extend the printDate() method to instance
return instance; //Return instance as the constructor Value return
}
var myDate = new MyDate();
dwn(myDate.toGMTString()); //The correct time string was successfully output this time. It seems that myDate is already a Date. Instance
, inheritance successful
myDate.printDate(); //If there is no return instance, it cannot be accessed with subscripts, because it is a private object method
4, copy inheritance method Example:
Function.prototype.extends = function(obj)
{
for(var each in obj)
{
this.prototype[each] = obj[each];
//Copy the properties of the object one-to-one, but It is slow and prone to problems
//So this "inheritance" method is generally not recommended
}
}
var Point2D = function(){
//...
}
Point2D.extends(new Point())
{
//...
}
This inheritance method seems to be rarely used.
5, mixed inheritance example:
function Point2D( x, y)
{
this.x = x;
this.y = y;
}
function ColorPoint2D(x, y, c)
{
Point2D .call(this, x, y); //This is construction inheritance, calling the constructor of the parent class
//From the previous example, this is equivalent to
//this.base=Point2D ;
//this.base.call(this,x,y);
this.color = c;
}
ColorPoint2D.prototype = new Point2D(); //Prototype is used here Inherit and let ColorPoint2D take the Point2D object as the prototype

Javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps、whilejavascriptisforinteractivewebpages.1)javaiscompiled、staticatically、andrunsonjvm.2)javascriptisisterted、dynamsornoded.3)

JavaScriptコアデータ型は、ブラウザとnode.jsで一貫していますが、余分なタイプとは異なる方法で処理されます。 1)グローバルオブジェクトはブラウザのウィンドウであり、node.jsのグローバルです2)バイナリデータの処理に使用されるNode.jsの一意のバッファオブジェクト。 3)パフォーマンスと時間の処理にも違いがあり、環境に従ってコードを調整する必要があります。

javascriptusestwotypesofcomments:シングルライン(//)およびマルチライン(//)

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

メモ帳++7.3.1
使いやすく無料のコードエディター

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。
