入力オブジェクトにメソッドを適用できる関数が必要です。コンセプト:JavaScriptでコンストラクタのように機能する関数を作成する
まず、関数を作成します。
$ = function() { /* Constructor Code */ };
次に、メソッドを追加します。たとえば、type
となります。このメソッドは次の関数を使用します。
function() { return toString.call(this).slice(8, -1);
最後に、正しい出力が得られるかどうかをテストします。出力が入力と異なる必要があります
$("test"); // Output: "test"
$("test").type(); // Output: "String"
$(document.body).type(); // Output: "HTMLBodyElement"
唯一の方法は、方法の適用である:これは、我々が見てみたいものです。いずれかの動作しませんまた
$("test").type(); // Output: "Object"
、eval
関連の方法を使用して、いくつかのオブジェクトは、に変換しないように、:それはオブジェクトに入力を変換するように、動作しませんObject.addProperties
を使用
文字列:
$(document.body).type(); // Error: Can't convert element to string!
オブジェクトのプロパティを手動でオブジェクトに追加する場合も同じです。
$("test").type(); // Can't apply function to literal string!
質問は、私たちがを何、ありますか?
これは興味深いコンセプトですが、どのように適用されるかは完全にはわかりません。渡した値をプリミティブ型のオブジェクト形式(Object.assign経由)に強制してから、そのプリミティブオブジェクトのインスタンスにプロパティを追加します。あなたのタイプ**は**変更されていないように見えますが、そうではありません。 'Number(5)=== 5 // true'ですが、' $(5)=== 5 // false'です。 'typeof 5 //" number "'、 'typeof $(5)//"オブジェクト "'さらに、あなたの明確化に応えて 'Number(5)=== $(5)// false'を – mhodges
@mhodgesと答えました。 – imaxwill
修正された答えの最後に追加した質問については、これを行う方法は単にjQueryのようにオブジェクトラッパーを使用することです。残念なことに、元の値を取得するためにアクセサメソッドを使用する必要がありますが、内部的にクロージャを利用して元の変更されていない値にアクセスすることができます。 'this'コンテキストを使用する代わりに、' toString.call(_)。slice(8、-1) 'と言って実際にそれを行うこともできます。 – mhodges