対象と原型に向かう(三)

3216 ワード

原型
すべてのJavaScriptオブジェクトは、他のJava Scriptオブジェクト(またはnull)に関連しています.二つ目のオブジェクトは原型と呼ばれ、最初のオブジェクトは原型から属性を継承します.
言い換えれば、JSオブジェクトごとに対応するプロトタイプオブジェクトがあり、プロトタイプオブジェクトから属性と方法を継承します.
デフォルトでは元のオブジェクトは空のオブジェクトです.
デフォルトでは、各プロトタイプのオブジェクトにはconstructor属性があり、この属性はプロトタイプに属する方法を指します.デフォルトでは、プロトタイプからプロトタイプを指します.
関数のプロトタイプ
各関数はFunctionの例です.ですから、下の二つの出力はtrueです.
```javascript
alert(Object.__proto__ == Function.prototype)
function Demo(){}
alert(Demo.__proto__ == Function.prototype)
```
Objectはシステム内蔵の一つの方法です.プロト.Funtion.prototypeです.この時、自分で定義したデモの方法と同じです.
プロトタイプ
関数を作成すると、JSは自動的にこの関数にプロトタイプの属性を追加します.値は空のオブジェクトです.関数のインスタンスを格納するためのオブジェクト共有の属性と方法.この対象は原型の対象で、原型と略称します.
プロトタイプは関数の属性で、オブジェクトにはこの属性がありません.
  • のいずれのオブジェクトも、そのプロトタイプオブジェクトから方法と属性を継承する.したがって、オブジェクト内に存在しない方法または属性が呼び出されると、プロトタイプチェーンの最上位に到達するまで、プロトタイプの一級レベルの検索が継続される.
    function Demo () {
    }
    Demo.prototype.name = function(){
        alert('prototype function')
    }
    var d = new Demo()
    var d2 = new Demo()
    alert(d.name == d2.name) // true
    d.name()
    d2.name()
    alert(d.hasOwnProperty('name')) // false
    alert(d2.hasOwnProperty('name')) // false
    d.name = function(){
       alert('d.name')
    }
    d.name()
    d2.name()
    
  • 初期の時、dとd 2にはnameメソッドがありませんでした.呼び出し時には両方ともプロトタイプのnameメソッドが見つかりますので、両者は等しく、出力の結果は同じです.プロトタイプfunctionです.
  • はdのname方法を再定義し、dにname方法がある(ただし、d 2にはname方法がない)ので、再度出力する場合、d出力はd.nameであり、d 2出力は依然としてprototype functionである.
  • プロトタイプは、一般的なオブジェクトとしてもよく、プロトタイプの属性と方法は別の例で共有されているという違いがあります.
  • 関数が普通の関数である場合、プロトタイプオブジェクトはあまり役に立たない.
  • プロトタイプを使用してクラスを拡張する機能があります.
    String.prototype.ex = function(){
        alert('this is ex');
    }
    'str'.ex() //    String    ex   ,         String    
    
  • オリジナルオブジェクトをカスタマイズ
    オブジェクトを手動で指定できます.以下のとおりです
    function Demo () {
    }
    
    var cp =  {
        age:'fdafdasfasdf'
    };
    
    Demo.prototype= cp; //   cp       Demo      
    
    var d = new Demo()
    alert(d.age) // Demo     d                   
    alert(Demo.prototype.constructor == Demo) //false
    alert(Demo.prototype.constructor == Object) //true
    
    プロトタイプのオブジェクトを指定すると、プロトタイプのオブジェクトのconstructor属性はコンストラクタを指しません.
    デフォルトの状況に達するためにコンストラクタは元のコンストラクタを指しています.手動で元のオブジェクトにコンストラクタの属性を追加して、コンストラクタを指します.cpの初期化は以下のような形に変更されます.
    var cp =  {
        age:'fdafdasfasdf',
        constructor:Demo //      constructor    Demo
    };
    
    同前プロト.
  • の各関数にはプロトタイプ属性があり、プロトタイプを指すために使用されます.この関数をコンストラクタとして呼び出すと、JSはこのコンストラクタの例を作成してくれます.実例はコンストラクタprototypeのすべての属性と方法を継承します.だから、対象の_u uプロト.自分のコンストラクタのプロトタイプを指します.
    function Demo(){
    
    }
    var p = {}
    Demo.prototype = p;
    var d = new Demo()
    document.write(Demo.prototype == d.__proto__) // true
    document.write(Demo.prototype == p) //  true
    
  • プロトタイプの最上階のオブジェクトはObject.prototypeで、つまりObjectのプロトタイプのオブジェクトです.そしてその対象の_u uプロト.属性値はnullです.つまりObjectの原型対象に原型がないということです.
    alert(Object.prototype.__proto__) // null
    
  • 比較
  • prototypeは、関数のプロトタイプを指します.
  • __プロト.オブジェクトの内部属性です.構造関数のプロトタイプを指します.オブジェクトはプロトタイプチェーンクエリに依存します.
  • prototypeは関数のみであり、他のオブジェクトはこの属性を持たない.プロト.は、オブジェクトの内部属性で、どのオブジェクトも属性を持っています.ですから、どの関数も__u u uを持っています.プロト.属性——関数もオブジェクトです.