3

Douglas Crockford による JavaScript の入門講義を見たところです。その中で彼はobject、オブジェクトにパラメーターとしてリンクされた新しいオブジェクトを作成するために使用する関数について言及しています。彼の言いたいことは、私が言うなら

var objB = object(objA);

objB内部[[prototype]]参照は に設定されてobjAいますが、彼はそのように明示的に定式化していません。

一方、私は彼のを読んだことがありますが、その中で彼はそのような関数についてまったく言及しておらず、代わりにプロトタイプからオブジェクトを作成する独自の方法を提示し、次の関数を定義しています。

Object.create = function(o) {
   var F = function() {};
   F.prototype = o;
   return new F();
}

基本的に、新しく作成されたオブジェクトnewの内部[[prototype]]リンクをコンストラクター関数のprototypeプロパティが指すものに設定するオペレーターの動作を利用します。

私の質問は、なぜ彼が組み込み関数を省略し、同じことを行う独自の方法を発明したのかということです。関数への以前の呼び出しはobject本当に同等ですか

var objB = Object.create(objA);

それとも若干の違いはありますか?

4

2 に答える 2

3

この 2 つの関数はまったく同じものであり、どちらも JavaScript に組み込まれていません。なぜ彼が異なる命名規則を切り替えたのかを説明しているCrockford の記事を参照してください。

将来からの編集:私はこの古い答えを見て、 Object.create()が実際にネイティブの (そして非常に重要な) ES5 メソッドであることを指摘したいと思いました。

于 2011-11-03T19:08:39.503 に答える
1

違いはありません。そして、ここに「簡略化された」説明があります:

問題は、javascript のすべてがオブジェクトであり、Object.

また、新しいタイプのオブジェクトを定義するディレクティブとして「関数」を見ることもできます。実際には、 new キーワードを使用している場合はオブジェクトのコンストラクターです。以下の例のように new キーワードを使用せず、関数を呼び出す場合

function doSomething(){
  alert("works");
}

JavaScriptエンジンは、prototypeプロパティを含むオブジェクトdoSomethingを作成します。このプロトタイプは、オブジェクトdoSomethingの定義されたタイプであり、JavaScript開発者が上記のコードで作成したコンストラクターを含みます。関数またはプロトタイプの組み込みの場合、コンストラクターにはネイティブ コードがあります。

于 2011-11-03T19:13:46.360 に答える