0

私が理解したいjavascriptorの振る舞いが 1 つだけあります。node.js' require()私はすでにこれを読みました:

.prototype なしでコンストラクター関数に新しいプロパティを追加する

この:

関数をオブジェクトに入れることとプロトタイプを作成することの違いは?

ただし、require() http://docs.nodejitsu.com/articles/getting-started/what-is-requireを使用して次のような新しいオブジェクトを作成する場合:

var Ftp = require("jsftp"),
    ftp = new Ftp({
      host: "ftp.mywebsite.com",
    });

そして、ftp.getPutSocket()後で行う場合、実際には jsftp.js ファイルでオリジナルFtp.getPutSocket = function() {}呼び出しているとしましょう。

さて、それはどうしてでしょうか?もしそうならnew Something()、あなたは に電話するしかないと思いましFtp.prototype.getPutSocketた。それでrequire()、ここで魔法をかけましたか?

更新 1:

なので関係ないですがrequire()、基本的にfunction.call(Ftp.prototype)は終わりのセリフです。しかし、どうしてこれでエラーが発生したのですか:

http://jsfiddle.net/qhoc/7j3Vp/

var Test = function() {
    console.log('aa');
}

(function() {
    this.anotherTest = function() {
        console.log('bb');
    }
}).call(Test.prototype);

エラー:

Uncaught TypeError: Cannot read property 'prototype' of undefined 

https://github.com/sergi/jsftp/blob/master/lib/jsftp.jsと同じことをやってみました

4

2 に答える 2

1

JavaScript のvariable hoistingが原因でエラーが発生しています。コードを次のように変更した場合:

function Test() {
    console.log('aa');
}

(function() {
    this.anotherTest = function() {
        console.log('bb');
    }
}).call(Test.prototype);

それはうまくいくでしょう。

その理由は、次のような関数の宣言にはいくつかの重要な違いがあるためです。

function F() {} // Function declaration

そして好き

var F = function() {} // Function expression

最初の例では、宣言であるため、F他の式よりも先に解析および評価されます。そのため、次のようなことができます。

console.log(myFun());

function myFun() {
  return 'Hi there!';
}

使用後に関数を宣言していても機能します。一方、次のように書くと、

console.log(myFun());

var myFun = function() { // expression
  return 'Hi there!';
}

これvarは、式 (代入式の一部) であるため、実際に使用された後に実行されるため、機能しません。

あなたの例では、関数がまだ割り当てられていないとcall評価されるとき、それがあなたがそれを得る理由です。Test.prototypeTestTypeError

これに関するより良い情報と洞察:

于 2013-05-02T10:11:57.027 に答える