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.prototype
はtoString
を自動的に呼び出し、文字列の接合操作を行った(もちろん変数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
にすぎないことがわかる.このような方法で結果を出すことはできません.これは使うときは注意しなければなりません.