4

JavaScript 関数について質問があります。次の 2 つの関数定義を考慮します。

    // run time definition 
    var foo_1 = function () {
        console.log("I ma foo 1"); 
    }
    // parse time definition 
    function foo_2 ()  {
        console.log("I ma foo 2"); 
    }

javaScript ではすべてがオブジェクトであるため、2 つの新しいオブジェクトが名前foo_1で作成さfoo_2れ、前のコードで作成されますか? もしそうなら、それらのプロトタイプ オブジェクトは何ですか? これらのオブジェクトはいつ作成されますか?

var obj={}また、と varの本当の違いを理解するのに苦労していfoo=function(){}ます。どちらもオブジェクトですが、最初のものには "type"Objectがあり、2 番目には type がありfunctionます。これは正しいです?

私の著書「JavaScript の良い部分」によると、すべての新しいリテラル オブジェクトはObject.prototypeデフォルトで空のオブジェクトにリンクされています。この動作を確認するために、次のスクリプトを実行しようとしました。

Object.prototype
//Object {}
Object.prototype = { name: "This is an experiment"}; 
//Object {name: "This is an experiment"}
function test() { conosle.log("Test"); }
test.prototype;
//Object {}

の結果がtest.prototype空のオブジェクトになるのはなぜですか?

最後に、これらの関数定義が次のコードと同等かどうか疑問に思っていました。

   this.foo =  function() {
         console.log("I ma foo");
    }

もしそうなら、何thisですか?

4

3 に答える 3

4

test.prototype の結果が空のオブジェクトになるのはなぜですか?

すべての関数には、最初に空のオブジェクトを参照するprototypeプロパティがあります。

定義 : (resig)

プロトタイプは、オブジェクトのインスタンスに自動的に適用されるプロパティと機能を定義する便利な手段として、JavaScript 全体で使用されます。

関数ではなくObjectprototypeの値を設定します。test

JS では - すべてのオブジェクト - 継承しObject.prototypeます。

必要に応じて - に関数を追加した場合Object.prototype:

Object.prototype.name = function (){alert(1);}; 
function test() { console.log("Test"); }
var a = new test();
a.name();

それは警告します1

編集

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

私たちが本当に達成したいのは、Player が Person になり、Person が Mammal になり、Mammal が Animal になり、Object に至るまでの一連のプロトタイプです。このようなプロトタイプ チェーンを作成する最善の方法は、オブジェクトのインスタンスを他のオブジェクトのプロトタイプとして使用することです。

SubClass.prototype = new SuperClass();

このコードを検討してください:

function Person(){}

   Person.prototype.dance = function(){};

function Player(){}

   Player.prototype = new Person();     <------

var player = new Player();

assert(player instanceof Player,"player receives functionality from the Player prototype");
assert(player instanceof Person, "... and the Person prototype");
assert(player instanceof Object, "... and the Object prototype");
assert(typeof player.dance == "function", "... and can play!")

上記の行は、プレイヤーを人から作成できるようにするものです (そして、プレイヤーが人のインスタンスであることがわかります!):

ここに画像の説明を入力

http://jsbin.com/oNixIMo/8/edit

于 2013-11-10T12:09:40.650 に答える
1

Yesvar fn = function(){};は Function 型です

test.porototype が空である理由: Object.prototype ではなく Function.prototype であるため

これは何ですか:最後に投稿されたリンクで回答

関数をコンストラクターとして使用して、オブジェクトを作成できます。

var Person = function(name){
  this.name = name;
};
Person.prototype.walk=function(){
  this.step().step().step();
};

この例では、Person はコンストラクター関数と呼ばれます。これは、次のようなプロパティを与えることができるオブジェクトであるためです。Person.static="somthing"これは、Person に関連する静的メンバーに適しています。

 Person.HOMETOWN=22;
 var ben = new Person("Ben");
 ben.set(Person.HOMETOWN,"NY");
 ben.get(Person.HOMETOWN);//generic get function what do you thing it'll get for ben?
 ben.get(22);//maybe gets the same thing but difficult to guess

Person を使用してインスタンスを作成するときは、 new キーワードを使用する必要があります。

var bob = new Person("Bob");console.log(bob.name);//=Bob
var ben = new Person("Ben");console.log(bob.name);//=Ben

プロパティ/メンバーnameはインスタンス固有であり、ボブとベンでは異なります

メンバー walk はすべてのインスタンスで使用できます (bob と ben は Person のインスタンスです)

bob.walk();ben.walk();

walk() が bob (および後に ben) で見つからなかったため、JavaScript は Person.prototype でそれを探します。bob と ben の両方がこれを共有する walk 関数は 1 つだけですが、walk 関数では を使用するため、関数の動作は異なりますthis

ベンが赤信号を待っていて、walk を呼び出し、ボブが青信号だった場合walk、ボブとベンに対してまったく同じことを行いますがthis、現在のオブジェクト (bob forベンのためのボブとベン)。

ben.walk=22bob と benwalkが ben.walk への 22 の割り当てを共有していても、bob.walk には影響しません。これは、そのステートメントがwalkben で呼び出されるメンバーを作成し、値 22 を割り当てるためです。bob.walk を要求するとwalk、bob で見つからないため、Person.prototype.walk 関数が取得されます。ただし、メンバー walk は ben で作成されており、JavaScript が ben で walk を検出したため、Person.prototype を検索しないため、ben.walk を要求すると値 22 が返されます。

そのため、インスタンスでメンバーが見つからない場合、JavaScript エンジンはコンストラクターのプロトタイプを調べます。では、ben.hasOwnProperty はどこで形成されるのでしょうか。インスタンス ben にはありません。Person.prototype にはありません。答えは、プロトタイプチェーンがあり、Person のコンストラクターが Function であるため、hasOwnProperty が ben または Person.prototype で見つからない場合、Person のコンストラクターのプロトタイプ (is Function) を参照します。そこに hasOwnProperty が見つからない場合 (しかし見つけることはできます)、関数のコンストラクターのプロトタイプ (オブジェクトです) を調べます。

Object.create(null,{})私の意見では悪い考えでない限り、すべては Object.prototype から継承する必要があります。Object.prototype に何かを追加することができ (どちらも良い考えではありません)、JS のオブジェクトは次のことを「継承」します。

Object.prototype.yipee=function(){
  console.log("yipeee");
};

22..yipee();//logs yipeee
"hello".yipee();//logs yipee

基本を理解したので、次のことを確認してください。

https://stackoverflow.com/a/16063711/1641941 (最後に「この変数」から始めます)

于 2013-11-10T12:49:12.287 に答える