JavaScript中_uプロト.プロトタイプとの関係を深く理解する

5688 ワード

ここでは対象の内部プロトタイプとコンストラクタのプロトタイプの関係について議論します.
一、あらゆるコンストラクタ/関数の_u uプロト.全部Function.prototypeを指しています.空の関数です.
 
  
Number.__proto__ === Function.prototype // true
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype // true
Object.__proto__ === Function.prototype // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype // true
RegExp.__proto__ === Function.prototype // true
Error.__proto__ === Function.prototype // true
Date.__proto__ === Function.prototype // true
JavaScriptにはビルダー/オブジェクトを内蔵した合計12個(ES 5にJSONを追加)があります.ここでは訪問可能な8つのビルダーを挙げます.Globalのように直接アクセスできない場合は、Agmentsは関数呼び出し時にJSエンジンで作成され、Math、JSONはオブジェクトとして存在し、newは必要ありません.それらの_プロト.Object.prototypeです.次のとおりです
 
  
Math.__proto__ === Object.prototype // true
JSON.__proto__ === Object.prototype // true
上に述べた「すべてのコンストラクタ/関数」には、もちろんカスタムが含まれています.次のとおりです
 
  
//
function Person() {}
//
var Man = function() {}
console.log(Person.__proto__ === Function.prototype) // true
console.log(Man.__proto__ === Function.prototype) // true
これは何を説明しますか?
すべてのコンストラクタはFunction.prototypeから来ています.さらに、根コンストラクタObjectおよびFunct自身も含まれています.すべてのコンストラクタはFuntion.prototypeの属性と方法を継承しています.length、call、appy、bind(ES 5)のように.
Function.prototypeも唯一のtype of XXX.prototypeが「function」のprototypeです.他のコンストラクタのprototypeはすべて対象です.次のとおりです
 
  
console.log(typeof Function.prototype) // function
console.log(typeof Object.prototype) // object
console.log(typeof Number.prototype) // object
console.log(typeof Boolean.prototype) // object
console.log(typeof String.prototype) // object
console.log(typeof Array.prototype) // object
console.log(typeof RegExp.prototype) // object
console.log(typeof Error.prototype) // object
console.log(typeof Date.prototype) // object
console.log(typeof Object.prototype) // object
えっと、上にも書いてありますが、空の関数です.alertを見てください.
すべてのコンストラクタ(内蔵とカスタムを含む)の_u u u u u u u u u uプロト.全部Funtion.prototypeです.あのFuntion.prototypeのです.プロト.誰ですか
JavaScriptの関数も一等公民だと聞いたことがありますが、どこから体現できますか?次のとおりです
 
  
console.log(Function.prototype.__proto__ === Object.prototype) // true
これはすべてのコンストラクタも普通のJSオブジェクトであり、コンストラクタに属性などを追加/削除することができることを示しています.Object.prototypeのすべての方法を継承しています.toString、valueOf、hasOwnPropertyなどです.
最後のObject.prototypeのu u uプロト.誰ですか
 
  
Object.prototype.__proto__ === null // true
もう頂上です.nullです.
二、全ての対象の_uプロト.そのコンストラクタのプロトタイプを指します.
上で全てのコンストラクタとカスタムコンストラクタを内蔵するテストを行いました.proto_,これらのコンストラクタの具体的な対象の_u u u u u u u u u uを見てみます.プロト.誰を指しますか
まず、JavaScriptエンジン内蔵コンストラクターを見てください.
 
  
var obj = {name: 'jack'}
var arr = [1,2,3]
var reg = /hello/g
var date = new Date
var err = new Error('exception')
console.log(obj.__proto__ === Object.prototype) // true
console.log(arr.__proto__ === Array.prototype) // true
console.log(reg.__proto__ === RegExp.prototype) // true
console.log(date.__proto__ === Date.prototype) // true
console.log(err.__proto__ === Error.prototype) // true
またカスタムのコンストラクタを見てください.ここでPersonを定義します.
 
  
function Person(name) {
this.name = name
}
var p = new Person('jack')
console.log(p.__proto__ === Person.prototype) // true
pはPersonの実例的なオブジェクトであり、pの内部プロトタイプは常にそのプロトタイプを指す.
各オブジェクトにはconstructor属性があり、そのコンストラクタを取得することができます.以下の印刷結果も恒等です.
 
  
function Person(name) {
this.name = name
}
var p = new Person('jack')
console.log(p.__proto__ === p.constructor.prototype) // true
上のPersonはプロトタイプに属性や方法を追加していません.ここでプロトタイプにget Name方法を追加します.
 
  
function Person(name) {
this.name = name
}
//
Person.prototype.getName = function() {}
var p = new Person('jack')
console.log(p.__proto__ === Person.prototype) // true
console.log(p.__proto__ === p.constructor.prototype) // true
p._.が見られますプロト.Person.prototype、p.com nstructor.prototypeと同じ対象を指します.
他の方法で原型をセットすれば、結果は少し違ってきます.
 
  
function Person(name) {
this.name = name
}
//
Person.prototype = {
getName: function() {}
}
var p = new Person('jack')
console.log(p.__proto__ === Person.prototype) // true
console.log(p.__proto__ === p.constructor.prototype) // false
ここではPerson.prototypeを直接書き直しました.出力結果からp.u_uプロト.まだPerson.prototypeを指しています.p.com nstructor.prototypeではありません.
これもよく理解できます.Person.prototypeに値を割り当てたのはオブジェクトの直接量です.オブジェクトの直接量で定義されたオブジェクトを使って、そのコンストラクタはルートコンストラクタObject、Object.prototypeは空のオブジェクトです.次のとおりです
 
  
var p = {}
console.log(Object.prototype) // {}
console.log(p.constructor === Object) // constructor Object
console.log(p.constructor.prototype === Object.prototype) // true,
上のコードに使われている__u uプロト.現在はIE 6/7/8/9ではサポートされていません.IE 9では、Object.get ProttypeOf(ES 5)を使用してオブジェクトの内部原型を取得することができます.
 
  
var p = {}
var __proto__ = Object.getPrototypeOf(p)
console.log(__proto__ === Object.prototype) // true