10

私はプロトタイプの上書きを防ぐための Crockford shim を読んでいて、それが最終的な解決策ではないことを理解しています。また、 ES5 Shimがこれに代わる実行可能な代替手段になる可能性があることも理解しています。また、より堅牢で安全な代替手段を提供するこの投稿も読みました。

Object.createそれでも、彼のシムが何を「言っている」のか、そして「何をしているのか」を知りたい. 私の説明コメントが正しいかどうか誰か教えてもらえますか?

if (typeof Object.create === 'undefined') { 
//If the browser doesn't support Object.create

  Object.create = function (o) {
  //Object.create equals an anonymous function that accepts one parameter, 'o'.

    function F() {};
    //Create a new function called 'F' which is just an empty object.

    F.prototype = o;
    //the prototype of the 'F' function should point to the
    //parameter of the anonymous function.

    return new F();
    //create a new constructor function based off of the 'F' function.
  };
}

//Then, based off of the 'Lost' example in the Crockford book...

var another_stooge = Object.create(stooge);

//'another_stooge' prototypes off of 'stooge' using new school Object.create.
//But if the browser doesn't support Object.create,
//'another_stooge' prototypes off of 'stooge' using the old school method.

このようにして、「another_stooge」に追加するときに「stooge」オブジェクトのプロトタイプを上書きすることはできません。「constructor」を使用して「stooge」プロトタイプをリセットする必要はありません。

前もって感謝します、

-k

4

5 に答える 5

15
if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}
var oldObject={prop:'Property_one' }; // An object
var newObject = Object.create(oldObject); // Another object

上記の例では、(Crockford の) 例で先にオブジェクトに追加したobjectのメンバー関数である method をnewObject使用して新しいオブジェクトを作成しました。したがって、基本的には、メソッドが function 、空のオブジェクトを宣言し、プロトタイプを継承し(その場合は create メソッドのパラメーターとして渡されるオブジェクトでもあります)、最後に new を返します。オブジェクト (F のインスタンス)は変数 を使用しているため、現在は を継承したオブジェクトです。オブジェクトが_ _createObjectObjectcreateFevery function is a first class object in javascriptoooldObjectreturn new F();newObjectnewObjectoldObjectconsole.log(newObject.prop);Property_onenewObjectoldObjectpropそれがasの値を持っている理由Property_oneです。これはプロトタイプ継承として知られています。

createメソッドのパラメーターとしてオブジェクトを渡す必要があります

于 2012-04-13T13:57:25.073 に答える
0

F である新しいオブジェクト コンストラクターを作成し、渡されたオブジェクトをコンストラクター プロトタイプ プロパティに割り当てて、F コンストラクターで作成された新しいオブジェクトがそれらのメソッドを継承するようにするだけです。

次に、コンストラクターを使用して、新しく初期化されたオブジェクトを返します (new F() => F.prototype)。

しかし、通常、新しいオブジェクトコンストラクターは、継承元のオブジェクトコンストラクターと同じでなければならないため、クロックフォードはコンストラクターを適切に再割り当てできません。

于 2012-04-13T12:56:26.837 に答える
0

ここには 2 つのトリックがあります。

  1. F は単純な関数ではなく、コンストラクターです。
  2. 「F.prototype」は単なるプロパティであり、現時点では継承には何もしません。本当のトリックは、"new F()" を使用するとき、"new" が新しいオブジェクトを作成し、コンストラクターを呼び出し (ここでは何もしません)、新しいオブジェクトの内部 "prototype" フィールドに " の値を設定することです。 F.prototype" であるため、返されるオブジェクトは "o" から継承されます。

だから私は思う:

  • F はコンストラクターです
  • F は o から継承されません
  • "new F" (返されるオブジェクト) は o から継承されます
于 2013-04-04T20:05:02.490 に答える
0

あなたのコメントについて:

>   //Object.create equals an anonymous function that accepts one parameter, 'o'.

createのプロパティに関数が割り当てられていると言うほうが適切ですObject。すべての関数は、名前付きプロパティまたは変数に割り当てられているものとそうでないものがあるだけで、匿名と見なすことができます。

> //Create a new function called 'F' which is just an empty object.

関数を宣言します。はい、これもオブジェです。

>     F.prototype = o;
>     //the prototype of the 'F' function should point to the
>     //parameter of the anonymous function.

への参照oが割り当てられてF.prototypeいるのは、少し短く書くことです。

>     //create a new constructor function based off of the 'F' function.

いいえ、「F のインスタンスを返す」である必要があります。[[Prototype]]したがって、返されたオブジェクトには、関数に渡されたオブジェクトを参照する internalがあります。厄介な部分は、トリックを実行するために役に立たない F 関数を作成する必要があり、返されたオブジェクトのコンストラクターは empty を参照するため、有用な値を持たないことですF

とにかく、コンストラクターのプロパティが非常に信頼できるか、通常は特に有用であるというわけではありません。

このようにして、「another_stooge」に追加するときに「stooge」オブジェクトのプロトタイプを上書きすることはできません。「constructor」を使用して「stooge」プロトタイプをリセットする必要はありません。

それは奇妙な発言だ。*another_stooge* はstoogeprivateであるため、 from ではなくfrom[[Prototype]]を継承しています。stooge.prototypestooge.[[Prototype]]

another_stoogeから継承したい場合は、またはstooge.prototypeを使用すると、おそらく前者の方が適しています。Object.create(stooge.prototype)Object.create(new stooge())

すべてが理にかなっていることを願っています。

于 2012-04-13T13:45:47.870 に答える
-1

結果のオブジェクトを作成するものに近づけるObject代わりに、内部関数に名前を付けると思います。FObject.create()

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function Object() {}
        Object.prototype = o;
        return new Object();
    };
}
于 2016-09-20T08:41:20.903 に答える