Objectのいくつかの静的方法(3)

4283 ワード

0.前置き


私の個人ブログはまだ オンラインになっていませんが、クリック率から見ると、前の文章は1編あたり100人ぐらいがクリックしていましたが、実はこのクリックはもう満足しています(もしあなたが1編あたり10人未満のクリックを経験したことがあれば、私の今の心理状態も理解できるかもしれません).
今日は javascriptに続きます.実はこのシリーズの文章はこのようなタイトルで主に目を引くためで、私が必ず毎日このような文章を出すとは言っていません.結局、時々用事が多くて、毎日連載を強要しすぎると、ある程度文章の質が下がるに違いない.これは望ましくない.連載を続けることを保証し、できるだけ多く書くしかないが、 は保証できない.文章が十分な数に蓄積されると、読者に の感覚を与えることができるかもしれない.
今日は2つの方法についてお話しします.

Object.getPrototypeOf入力パラメータのプロトタイプを取得する


Object.toString , Object.prototype.toString定義オブジェクトの文字列表示


内容は比較的簡単で、大牛たちはスキップしたり、ツッコミを入れたりすることができます.

1.本文


Object.getPrototypeOf入力パラメータのプロトタイプを取得する


この方法によって、オブジェクトをパラメータとして入力すると、このオブジェクトの原型を返すことができ、使用方法は比較的簡単で、サイの本の第3部にも例を提供して、私は例に対して少し修正します
> var strObject = new String("lanzhiheng") //        ,   String.prototype
undefined

> Object.getPrototypeOf(strObject) //           
[String: '']

私は拭いて、これはきっと何も見えないでしょう、たとえ私がこのようにしても
> String.prototype
[String: '']
String.prototypeがたまたま[String: '']に換算されたことを説明するしかないようですが、誰がstrObjectの原型を作成することを保証することができますか?
2つのオブジェクトを指す変数を==で比較したのを覚えていますが、同じオブジェクトを指しているときだけ等しいですか?
> {} == {} //        
false

> var a = b = {}
undefined

> a == b // a b       
true

同じ原理で私たちはこのように判断することができます
> Object.getPrototypeOf(strObject) == String.prototype
true

ははは、これでstrObjectの原型がString.prototypeであることが判明した.さらに進む
> var obj = {};
undefined

> var nextObj = Object.create(obj) //  obj           
undefined

> Object.getPrototypeOf(nextObj) == obj //       obj
true

これでこの方法の役割がわかるのではないでしょうか.

Object.toString , Object.prototype.toString定義オブジェクトの文字列表示


ほとんどのタイプには独自のtoString種類の方法がありますが、もちろんnullはありません.また、ほとんどのオブジェクトにも対応するタイプのtoStringメソッドがあり、これはプロトタイプチェーンから継承され、つまりObject.prototype.toStringである.このプロトタイプのObject.prototype.toStringの方法はObject.toStringとは違います.前者はプロトタイプチェーンで伝承できるが,後者はObjectというタイプの方法にすぎない.
> Object.toString == Object.prototype.toString //        
false

> var b = Object.create(Object.prototype)
undefined

> b.toString == Object.prototype.toString //           
true

オブジェクトのプロパティがリロードされていない場合に呼び出されるのは、依然としてプロトタイプチェーンのObject.prototype.toStringメソッドであることがわかります.
もちろん、私たちは自分から呼び出すことはめったにありません.一般的には、必要なときに自動的に呼び出されます.見てください.
> Object.prototype.toString()
'[object Object]'
> var a = 1
undefined
> a + Object.prototype
'1[object Object]'

後続のObject.prototypetoStringを自動的に呼び出し、文字列の接合操作を行った(もちろん変数aも同様の変換を行った).
それ以外はprototype.toString toString`バージョンは、オブジェクトがどのタイプに属しているかを判断するために使用できます.
> function classOf(p) { //          
...     if (p === null) return 'null';
...     if (p === undefined) return undefined;
...     return Object.prototype.toString.call(p).slice(8, -1);
... }
undefined

> classOf(1)
'Number'
> classOf(null)
'null'

なぜ元のバージョンを呼び出すのですか?それぞれのタイプの原型にはtoStringがあるのではないでしょうか.
それぞれの異なるタイプのプロトタイプには、toStringが独自にカスタマイズされている可能性があります.Object.prototype.toStringという方法が必要です
> (new Date()).toString()
'Wed Oct 26 2016 09:00:31 GMT+0800 (CST)'
> (new Number()).toString()
'0'
> (new Object()).toString()
'[object Object]'
Object.prototype.toStringだけが[object Number]のような結果を返します.私たちは最後のNumberを持っていればいいだけです.
しかし、これは常に1つのオブジェクトを判断できる所属クラスではなく、内蔵タイプでなければ、私たちはそうすることはできません.
> function Range(x) {this.x = x} //      
undefined
> var r = new Range() //         
> classOf(new Range())
'Object'

得られたタイプはObjectにすぎないことがわかる.このような方法で結果を出すことはできません.これは使うときは注意しなければなりません.

2.最後に


この二つの方法はやはり理解しやすいので、うっかり言ってしまったことを許してください.最後まで見てくれてありがとう.

Happy Writing & Coding