JavaScriptの創世神話——すべては対象から来ています.
7716 ワード
聖書の第一章創世記の中に、神がどのように人間を創造したかという経典があります.神は言います.「私たちは私たちの姿を照らして、私たちの形で人を作ります.」偶然にも一致したのは、JavaScriptの中にも神の意図に従ってプログラム世界を創造しているようです.すべての対象の認知の中には、世の中の万物は一つの原型に由来しています.一つの統一された形式、一つのプラトンの口の中の理念があります.
JavaScriptのプログラミングアートもここから演じられます.
カタログ:1.対象に向かってプログラミングした初歩的思考2.類と対象3.構造関数constructor 3.1 newコマンド3.2 thisキーワード3.3.原型オブジェクト4.いくつかの関連方法
1.対象向けプログラミングの初歩的な思考
「対象向けプログラミング」(Object Oriented Programeming、略してOOPという)自体はプログラミングされた思惟モードであり、世界のすべてを対象の集合と見なし、世界の動きは一つの対象によって分業し、協力した結果である.
このようなマクロ次元のプログラミング認識があったら、コードの袋小路に閉じ込められなくなります.
私たちはホームページの開発において、常にイベントバインディングを行います.
学習が進むにつれて、OOPの章に入ると、「すべての対象」という言葉の深さを発見します.
上記のコードの中では、btn自体は一つのオブジェクトですが、クリックするとそのオブジェクトは自分のメソッドaddEventListenerを呼び出します.
誰が何をしましたか?btnをクリックした時に出力をしました.
もちろんこれは一つのケースにすぎません.JSのプログラミングにおいて、このようなプログラミングモードは一貫して貫通しています.
2.クラスとオブジェクト
長い間話しましたが、対象が何なのかさえはっきりした定義がないなら、プログラミングの過程においてはまだはっきりしないところがあります.オブジェクトとは、オブジェクトが現実的なものに対する抽象的なものであり、オブジェクトが属性と方法をパッケージ化したものであり、属性値はオブジェクトの状態を指し、方法は対象の行為を指す. たとえば、私たちはNBAのスーパースターのkobeをjavascriptの中の対象として抽象化しています.は'クラス'とは何ですか? 聖書の記述によれば、第一章の創世記には、「神は自らの姿に従って人をつくる」とある.
現実世界の万物(対象)の進化は、根拠なく生まれたのではなく、テンプレートによって様々な実例を作成する必要がある.
したがって、クラス(コンストラクタ)とは、このようなテンプレートを提供する「オブジェクト」(関数自体がjsでオブジェクト)であり、オブジェクトの抽象的なものである.
しかし、jsにはクラスの概念がなく、構造関数を通してクラスの機能を代替し、ある種類のオブジェクトに共通の属性と方法を提供しています.
コンストラクタにより、特定のクラスの属性と方法を有する様々な例示的なオブジェクトを作成することができる.
例えばバスケットボール選手のクラスを定義します.
【注】類はjsにおいて構造関数として表現されていますが、正確のために、以下の統一は構造関数と呼ばれます.
3.コンストラクタ
前に知ったように、世の中の万物は特定のテンプレート(クラスまたは構造関数)によって構成されていますが、すべての構造関数は最も一般的な構造関数Objectによって構成されています.
しかし、私たちは次のコードを見て、このような疑問が生じるかもしれません.1.構造関数のBookのthisは何ですか?何の道がありますか?2.構造関数Bookを使って、javascriptを構成する時newはどのような役割を果たしていますか?3.なぜ私がインスタンスオブジェクトを作った後、この構造関数はオブジェクトに戻ります.つまり、全体の建造物の過程で、構造関数の運営メカニズムはどうなっていますか? thisは構造関数の役割のキーワードであるthisはjsにおいて非常に重要であり、それは異なる運行環境(属性と方法の調整者)が指す環境(対象)とは違って、つまりthisの指向はダイナミックであるが、thisの指向は誰であれ、属性と方法の調整者が誰であるかを明確にするだけであれば、誰を指すかを指す. new命令の原理は、次にnew命令の原理を説明します. newコマンドの役割は、構造関数を実行して、インスタンスのオブジェクトを返します.
通常の正常呼び出し関数とは異なり、関数実行前にnewコマンドを付加し、関数は以下のステップを実行します.
1.戻りたいオブジェクトの例として、空のオブジェクトを作成します.プロトタイプオブジェクト上では、構造関数がインスタンスオブジェクトを作成する際の部分的な動作機構を基本的に理解し、thisキーワードとnewコマンドがインスタンスを構成する際に果たす役割を理解した. 今最も重要な疑問があるのは、具体的なオブジェクトは一体どのように構造関数の中で設定されたこのクラスに属する共通の属性と方法を継承しますか?
prototype object
JavaScriptの各インスタンスオブジェクトは別のオブジェクトから継承され、後者はプロトタイプオブジェクトと呼ばれ、プロトタイプオブジェクト上の属性と方法は派生オブジェクトに共有されます.これはJavaScriptの有名な継承メカニズムの基本設計です.
先にコードを書いて説明します.
2.各コンストラクタにはプロトタイプの属性があります.この属性はインスタンスオブジェクトのプロトタイプです.
3.インスタンスオブジェクトの内部には、構造関数によって作成されると、構造関数のprotype属性を指す
このようにして,構造関数Dugにおけるプロトタイプオブジェクトの例となるtony対Dugの共有属性と方法の継承を実現した.
したがって、モデルオブジェクトはすべてのインスタンスオブジェクトの共通の属性と方法を定義し、すべてのインスタンスオブジェクトはプロトタイプオブジェクトから派生されたサブオブジェクトに過ぎず、後に特有の属性と方法を加えただけであると考えられます.
prototype chain
例示的なオブジェクトtonyの
構造関数自体も、より一般的な関数(本質的にはオブジェクト)を指すプロトタイプオブジェクトが存在する.
さらに、この関数は、最も一般的な構造関数Objectを指すプロトタイプオブジェクトも存在する.
このような幾重にもネストされた関係はプロトタイプチェーンを形成する.
トニーという名前の犬は、まずコンストラクションDgのプロトタイプオブジェクトを継承し、Dugのプロトタイプオブジェクトの
ここでもう一度構造関数Objectの威力を体現しています.すべての対象はObjectの派生にすぎません.Object.prototypeの属性と方法を継承しています.「すべての対象」の思想をより深く表現しています.
4.いくつかの関連方法 instance of演算子instance of演算子は、指定されたオブジェクトが何らかの構造関数であるかどうかを示すブール値を返します. Object.get ProttypeOf() Object.get ProttypeOf()は、元のオブジェクトを取得するための標準的な方法です. Object.set ProttotypeOf()Object.set ProttotypeOf この方法は既存のオブジェクトのプロトタイプを設定し、新しいオブジェクトを返します.この方法は2つのパラメータを受け入れます.最初は既存のオブジェクト、2番目はプロトタイプのオブジェクトです. Object.creat()Object.create方法は、プロトタイプオブジェクトから新しいインスタンスオブジェクトを生成するために使用され、newコマンド の代わりにすることができる. Object.isProttypeOf()オブジェクトのインスタンスのisProttypeOf方法は、オブジェクトが別のオブジェクトの原型であるかどうかを判断するために使用される. Object.prototype.hasOwnProperty()オブジェクトのインスタンスのハスOwnProperty方法は、ある属性がオブジェクト自身に定義されているか、それともプロトタイプチェーンに定義されているかを判断するためのブール値を返します.
阮一峰-JavaScript標準教程空腹人谷学習ノート
JavaScriptのプログラミングアートもここから演じられます.
カタログ:1.対象に向かってプログラミングした初歩的思考2.類と対象3.構造関数constructor 3.1 newコマンド3.2 thisキーワード3.3.原型オブジェクト4.いくつかの関連方法
1.対象向けプログラミングの初歩的な思考
「対象向けプログラミング」(Object Oriented Programeming、略してOOPという)自体はプログラミングされた思惟モードであり、世界のすべてを対象の集合と見なし、世界の動きは一つの対象によって分業し、協力した結果である.
このようなマクロ次元のプログラミング認識があったら、コードの袋小路に閉じ込められなくなります.
私たちはホームページの開発において、常にイベントバインディングを行います.
var btn = document.getElementById('button');
btn.addEventListener('click',function(){console.log('click me')})
初めて学ぶ時、筆者も無意識にaddEvent Listener()方法を見て、特定の元素をクリックしたら、需要が実現できます.もっと深く考えすぎないでください.学習が進むにつれて、OOPの章に入ると、「すべての対象」という言葉の深さを発見します.
上記のコードの中では、btn自体は一つのオブジェクトですが、クリックするとそのオブジェクトは自分のメソッドaddEventListenerを呼び出します.
誰が何をしましたか?btnをクリックした時に出力をしました.
もちろんこれは一つのケースにすぎません.JSのプログラミングにおいて、このようなプログラミングモードは一貫して貫通しています.
//1、
var sheep = {
color: white,
echo: function(){
console.log('mae~~~')
}
}
sheep.echo()
// mae
//2.
$('.passage').css({
width: '100px',
color: 'pink'
}
)
// passge jquery
......
つまり、JavaScriptのプログラミングは対象から逸脱することができません.2.クラスとオブジェクト
長い間話しましたが、対象が何なのかさえはっきりした定義がないなら、プログラミングの過程においてはまだはっきりしないところがあります.
var kobe = {
team: 'Los Angeles Lakers',
position: 'shooting guard',
ability : function(){
console.log('impress those who like basketball')
}
}
現実の世界のコービーは抽象的で、ロサンゼルスのレイカーズと位置に効力を発揮します.得点バックは彼の属性で、能力はバスケットボールが好きな人に影響を与えます.現実世界の万物(対象)の進化は、根拠なく生まれたのではなく、テンプレートによって様々な実例を作成する必要がある.
したがって、クラス(コンストラクタ)とは、このようなテンプレートを提供する「オブジェクト」(関数自体がjsでオブジェクト)であり、オブジェクトの抽象的なものである.
しかし、jsにはクラスの概念がなく、構造関数を通してクラスの機能を代替し、ある種類のオブジェクトに共通の属性と方法を提供しています.
コンストラクタにより、特定のクラスの属性と方法を有する様々な例示的なオブジェクトを作成することができる.
例えばバスケットボール選手のクラスを定義します.
// ,
var BasketballPlayer = function(){
this.height = '180+',
this.muscle = true,
this.ability = function(){
console.log('shooting and passing ')
}
}
// ( ) 3
var kobe = new BasketballPlayer();
var james =new BasketballPlayer();
var curry =new BasketballPlayer();
ここに小さな問題がありますが、構造関数BasktballPlayerは誰が作ったのですか?下のコードを見たら分かります.BasketballPlayer instanceof Object//true
js Object
したがって、すべてのインスタンスオブジェクトはクラス(構造関数)で作成されていますが、すべての構造関数は最も一般的なクラス、すなわちObjectで構成されていますので、すべてのオブジェクトが対象です.【注】類はjsにおいて構造関数として表現されていますが、正確のために、以下の統一は構造関数と呼ばれます.
3.コンストラクタ
前に知ったように、世の中の万物は特定のテンプレート(クラスまたは構造関数)によって構成されていますが、すべての構造関数は最も一般的な構造関数Objectによって構成されています.
しかし、私たちは次のコードを見て、このような疑問が生じるかもしれません.1.構造関数のBookのthisは何ですか?何の道がありますか?2.構造関数Bookを使って、javascriptを構成する時newはどのような役割を果たしていますか?3.なぜ私がインスタンスオブジェクトを作った後、この構造関数はオブジェクトに戻ります.つまり、全体の建造物の過程で、構造関数の運営メカニズムはどうなっていますか?
var Book = function(){
this.material = 'paper';
this.color = 'white';
this.utility = function(){
console.log('IQ+');
}
this.whoAmI = function(){
console.log(this)
}
}
var javascript = new Book()
// , window
var print = function(){
console.log(this)
}
print()//this Window, Window print
//
var o = {
print: function(){
console.log(this)
}
}
o.print()//this o, o print
したがって、構造関数のthisに戻って、var javascript=new Book()を実行すると、このときはjavascriptという例示的なオブジェクトが構造関数Bookを呼び出し、関数内部のthisがjavascriptという実例的なオブジェクトを指す.javascript.whoAmI()//this javascript
【注】もっと多くのthisの知識はwhat's thisを見ますか?通常の正常呼び出し関数とは異なり、関数実行前にnewコマンドを付加し、関数は以下のステップを実行します.
1.戻りたいオブジェクトの例として、空のオブジェクトを作成します.
2. ``__proto__`` prototype
3. this
4.
prototype object
JavaScriptの各インスタンスオブジェクトは別のオブジェクトから継承され、後者はプロトタイプオブジェクトと呼ばれ、プロトタイプオブジェクト上の属性と方法は派生オブジェクトに共有されます.これはJavaScriptの有名な継承メカニズムの基本設計です.
先にコードを書いて説明します.
function Dog(name,color){
this.name = name;
this.color = color;
}
Dog.prototype.spark = function(){
console.log('Wow~~~')
}
var tony = new Dog('tony','white')
1.構造関数Dugによって生成された例示的なオブジェクトtonyは、自動的にインスタンスオブジェクトtonyにプロトタイプオブジェクトを割り当てます.2.各コンストラクタにはプロトタイプの属性があります.この属性はインスタンスオブジェクトのプロトタイプです.
3.インスタンスオブジェクトの内部には、構造関数によって作成されると、構造関数のprotype属性を指す
__proto__
属性がある.このようにして,構造関数Dugにおけるプロトタイプオブジェクトの例となるtony対Dugの共有属性と方法の継承を実現した.
したがって、モデルオブジェクトはすべてのインスタンスオブジェクトの共通の属性と方法を定義し、すべてのインスタンスオブジェクトはプロトタイプオブジェクトから派生されたサブオブジェクトに過ぎず、後に特有の属性と方法を加えただけであると考えられます.
prototype chain
例示的なオブジェクトtonyの
__proto__
は、構造関数Dugのプロトタイプオブジェクトを指すので、Docg中のプロトタイプの属性と方法を継承する.構造関数自体も、より一般的な関数(本質的にはオブジェクト)を指すプロトタイプオブジェクトが存在する.
さらに、この関数は、最も一般的な構造関数Objectを指すプロトタイプオブジェクトも存在する.
このような幾重にもネストされた関係はプロトタイプチェーンを形成する.
トニーという名前の犬は、まずコンストラクションDgのプロトタイプオブジェクトを継承し、Dugのプロトタイプオブジェクトの
__proto__
には関数を継承したプロトタイプオブジェクトがあり、関数オブジェクトの__proto__
にはOjectのプロトタイプオブジェクトが引き継がれています.ここでもう一度構造関数Objectの威力を体現しています.すべての対象はObjectの派生にすぎません.Object.prototypeの属性と方法を継承しています.「すべての対象」の思想をより深く表現しています.
4.いくつかの関連方法
tony instanceof Dog//true
or
Dog.prototype.isPrototypeOf(tony)//true
var foo = { x:1 };
var bar = Object.setPrototypeOf({},foo)
bar.x === 1//true
私たちは以前にnew命令で実例的なオブジェクトを構築していましたが、本質的には一つの空のオブジェクトのプロトをコンストラクタのプロトタイプに向けて、そして実例的なオブジェクトにコンストラクターを実行します.var Person = function(){
this.race = 'monkey'
};
var Asian = new Person();
//
var Asian = Object.setPrototypeOf({},Person.prototype);
Person.call(Asian)
var Person = {
race: 'monkey'
}
var Asian = Object.create(Person)
//
var Person = function(){
this.race='monkey'
}
var Asian = new Person()
var obj1 = {};
var obj2 = Object.create(obj1);
obj1.isPrototypeOf(obj2)//true
var o = {
name:'teren'
}
o.hasOwnProperty('name')//true
o.hasOwnProperty('toString')//false
Object.getPrototypeOf(o).hasOwnProperty('toString')//true
参考文献:阮一峰-JavaScript標準教程空腹人谷学習ノート