-1

私の目標はmaster_script.jsを作成することです。主に開発で使用するハンドラファイル。

このファイルのサブセクションは、基本オブジェクトのプロトタイプのカスタマイズ専用です。

  1. 番号
  2. 配列
  3. 物体
  4. 日にち
  5. 関数
  6. ブール値

だから私は自分のコードブロックを書いている...

/********************************************************/
Object.defineProperty(
    Number.prototype,'len',
    {get:function(){
        str=this.toString()
        return str.length
    }}
)
/********************************************************/
n=123
o={123:'abc',abc:123}
/********************************************************/
console.log(
    'n              ⇒ ',n,
    '\n n.len       ⇒ ',n.len,
    '\n n.__proto__ ⇒ ',n.__proto__
)
/********************************************************/

正常に動作します!

  • コンソールで展開するn.__proto__と、プロパティが表示され、getter functionです。len: (...)get len: function (){
  • コンソールに入力n.すると、プロパティ|メソッドのリストにはっきりと表示されます。

o変数に対して同じ設定を構成すると、問題が発生します。

/********************************************************/
Object.defineProperty(
    Number.prototype,'len',
    {get:function(){
        str=this.toString()
        return str.length
    }}
)
/******************************/
Object.defineProperty(
    Object.prototype,'len',
    {get:function(){
        cnt=0
        for(i in this)  cnt++;
        return cnt
    }}
)
/********************************************************/
n=123
o={123:'abc',abc:123}
/********************************************************/
console.log(
    'n              ⇒ ',n,
    '\n n.len       ⇒ ',n.len,
    '\n n.__proto__ ⇒ ',n.__proto__
)
/******************************/
console.log(
    'o              ⇒ ',o,
    '\n o.len       ⇒ ',o.len,
    '\n o.__proto__ ⇒ ',o.__proto__
)
/********************************************************/

最初に気付くのは、コンソールn.にoro.を入力すると、プロパティ|メソッドのポップアップ リストにプロパティへの参照が含まれなくなっていることですが、完全な拡張子を入力するか、または orの目的の結果が得られると...lenn.leno.len32

したがって、コードが正当であることはわかっていますが、7 つの基本オブジェクトのそれぞれに約 40 の異なるプロパティとメソッドがあるため、コンソールポップアップが必要です...

そこで、問題を特定するためのテスト ブロックを作成しました。

/********************************************************/
Object.defineProperty(
    Object.prototype,'dis',
    {get:function(){return this}}
)
/******************************/
Object.defineProperty(
    Number.prototype,'len',
    {get:function(){return this.length}}
)
/********************************************************/
o={123:'abc',abc:123}
n=123
e=document.createElement('option')
/********************************************************/
console.log(
    'o              ⇒ ',o,
    '\n o.__proto__ ⇒ ',o.__proto__
)
/******************************/
console.log(
    'n              ⇒ ',n,
    '\n n.__proto__ ⇒ ',n.__proto__
)
/******************************/
console.log(
    'e              ⇒ ',e,
    '\n e.__proto__ ⇒ ',e.__proto__
)
/********************************************************/

.__proto__コンソールで を展開した直後に、o3つすべてに、最初にオブジェクトのみに割り当てようとしたプロパティが与えられていることに気付きましたnediso

それから私はそれをクラックしました:Number.prototypeそれ自体はオブジェクトです。したがって、それはdisからプロパティを継承しますObject.prototype

fromによって継承されずdisに、オブジェクトのみにプロパティを追加するにはどうすればよいですか?onObject.prototype

4

2 に答える 2

3

このファイルのサブセクションは、基本オブジェクトのプロトタイプのカスタマイズ専用です。

おいおい。私見の最高のアイデアではありません。特にObjectプロトタイプの修正。うん。

したがって、コードが正当であることはわかっていますが、7 つの基本オブジェクトのそれぞれに約 40 の異なるプロパティとメソッドがあるため、コンソール ポップアップが必要です...

なんで?ブラウザ コンソールで開発を行っていますか?

Object.prototype から n によって継承されることなく、dis プロパティを o オブジェクトのみに追加する方法を教えてください。

Ok...

Object.defineProperty(
    o, 'dis',
    { get:function(){ return this; } }
);

どのようだ?

Objectプロトタイプに追加したものはすべて、ほぼすべてのものに表示されます (これが悪い考えである理由です)。

からo のみ継承するObjectため、プレーン オブジェクトにのみ表示され、他のすべてには表示されないプロパティを定義する方法はありません。選択肢は次のとおりです。

  • でプロパティを直接定義するo、または
  • に単純なオブジェクトを使用する代わりに、独自のカスタム型からo作成oし、そのカスタム型のプロトタイプにプロパティを配置します (組み込み型のプロトタイプを変更するよりもはるかに優れています)。


注:もちろん、次のプロパティNumber.prototypeを持つように変更できます。disundefined

Object.defineProperty(Number.prototype, 'dis', {
    value: void 0
});

console.log((9).dis);

数値に関する限り、それで問題は解決しますが、そのdisプロパティは、存在する他のほとんどすべてのものに影響を与えます.

念のため、セミコロンを使用してください。子供たちのことを考えてください。

于 2015-01-22T08:26:03.383 に答える
0

これをチェックしてください:

/********************************************************
⇒   create the master objects.
/********************************************************/
function MasterObject(dis){
    Object.defineProperty(
        this,'this_object',
        {get:function(){return dis}}
    )
}
/******************************/
function MasterArray(dis){
    Object.defineProperty(
        this,'this_array',
        {get:function(){return dis}}
    )
}
/********************************************************
⇒   define the master properties.
/********************************************************/
Object.defineProperty(
    Object.prototype,'_',
    {get:function(){return new MasterObject(this)}}
)
/******************************/
Object.defineProperty(
    Array.prototype,'_',
    {get:function(){return new MasterArray(this)}}
)
/********************************************************
⇒   example to expand in the console.
/********************************************************/
x={a:1,b:2,c:3,d:4,e:5}
y=[]
    y['a']=1
    y['b']=2
    y['c']=3
    y['d']=4
    y['e']=5
z=[x,y]
/********************************************************
⇒   open the console, type [z], hit [enter] and expand...
/********************************************************/

流れ落ちる:

  • たとえば、Object.prototype呼び出されたプロパティを定義し、lenその値を に設定するとします5
  • を呼び出すと{}.len、5 の結果が得られます。また、 [].lenor"".lenまたはなどを呼び出すと、インスタンス化#.lenからの継承により同じ結果が得られます。Object.prototype
  • しかし、同じ名前で on プロパティを定義するとしましょうArray.prototype:- len& その値を に設定します50
  • {}.lenetcを呼び出すと、同じ結果の 5 が得られますが、呼び出す[].lenと 50 になりArray.prototypeます。lenObject.prototype

解決:

  • したがって、Object.prototype簡単にするために呼び出されるプロパティを 1 つだけ定義_し、その値を、オブジェクトに固有のハンドラのみを含むサブ構造オブジェクトに設定します
  • 次に、 に対して同じことを行いArray.prototypeますが、このプロパティの値を、配列のみ_に固有のハンドラーを含む別のサブ構造に設定します。
  • 次に、上記の要約の.lenプロパティと同様に、 overwritesのバージョン ergo のバージョンと同様に、さまざまな継承のない 2 つの完全に個別のプロパティがあります。Array.prototype_Object.prototype_

欠点:

  • 簡単な方法でプロパティにアクセスすることはできなくなりました。{}.lenプレフィックスを付ける必要があり{}._.lenます。

利点:

  • タスク全体でプロパティを定義するObject.prototypeと逆説的な悪夢になる可能性があり、コンソールにスローされたエラーでさえプロパティを継承し、100 個の新しいプロパティ|メソッドを追加するObject.prototypeと、コンソールでエラーを展開するとそれぞれが表示されます!
  • このメソッドにより、常に 1 つのプロパティのみが表示_され、そのプロパティは所有者オブジェクトのタイプに合わせてカスタマイズ可能になります。

拡張:

  • このコードを変更して、この標準に準拠していないさまざまなオブジェクトに対応することを検討しています。たとえば、次のハンドラーなどです。
x=document.getElementsByTagName('td')
y=x._.len

お気に入り:

function MasterObject(dis){
    if(dis.constructor.name=='HTMLCollection'){
        Object.defineProperty(
            this,'len',
            {get:function(){
                cnt=0
                for(ia in dis) cnt++;
                return cnt
            }}
        )
    }
        else{
            Object.defineProperty(
                this,'this_object',
                {get:function(){return dis}}
            )
        }
}

x._.lenそのため、オブジェクトの任意のリストで使用できますが{a:1}、これには not があるため、言うconstructor.nameことはobjectできませんHTMLCollection

ペット企画です。それは独自のプロトタイプ段階にあるだけであり、古い方法に戻るか、プロトタイプの変更を取り巻くこの汚名を打破して思いつく前に、このトピックに関する経験を持つ人から、この概念を拡張する方法についてのアイデアを探しています。新しいより効率的な方法!

于 2015-01-23T21:46:24.883 に答える