0

只有一种行为javascript或特别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()稍后再做,它实际上是Ftp.getPutSocket = function() {}jsftp.js文件中调用原始文件。

现在怎么可能?我想如果你这样做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

何时getPutSocket定义(https://github.com/sergi/jsftp/blob/master/lib/jsftp.js#L620),this实际上是Ftp.prototype(参见https://github.com/sergi/jsftp/blob/master/lib /jsftp.js#L803)。

所以看起来根本没有定义 Ftp.getPutSocket 。它仅在 上定义Ftp.prototype

更新1:

由于 javascript 评估事物的顺序,这失败了。首先是函数,然后是变量赋值。

然而,这有效:

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

(function() {
    this.anotherTest = function() {
        console.log('bb');
    }
}).call(Test.prototype);
于 2013-02-28T09:35:54.990 回答
1

您收到该错误是因为 JavaScript 的变量提升。如果您将代码更改为此:

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 回答