Javascript/原型

Javascript/原型,javascript,prototype,Javascript,Prototype,我有一个关于JavaScript的问题。我知道如何使用prototype,为什么要使用它,但我试着回答我这个问题,如果我在这样的函数中使用prototype会发生什么 var Command = function () { var text = 'Hello World'; Command.prototype.run = function () { console.log(text); }; }; var command = new Command()

我有一个关于JavaScript的问题。我知道如何使用prototype,为什么要使用它,但我试着回答我这个问题,如果我在这样的函数中使用prototype会发生什么

var Command = function () {
    var text = 'Hello World';

    Command.prototype.run = function () {
        console.log(text);
    };
};

var command = new Command();
command.run();

现在我将能够使用私有函数或变量。我已经用JSFIDLE示例构建了所有的变体,它表明我使用原型的地方似乎没有什么不同。但是,我可能已经过锁了吗?

函数表达式
命令.prototype.run
正在关闭var
测试。这叫做闭包

var Command = function () {
    var text = 'Hello World';

    Command.prototype.run = function () {  // text is closed over by this function
        console.log(text);
    };
};
Command.prototype.run1 = function () { // text is not in scope and thus not available.
    console.log(text);
};

var command = new Command();
command.run();  // this will work and display what is in text
command.run1();  // this will fail and throw text undefined error.

通常,如果变量位于定义函数的范围内,则该变量将可用于该函数。如果没有,则您无法访问它。

使用Prototype具有内存管理优势。 如果您不使用prototype,当您创建新对象时,您必须使用它创建新函数

var Command = function () {
    var text = 'Hello World';

    //One time create this function
    Command.prototype.run = function () {
        console.log(text);
    };

     this.test= function(){
       console.log(text);
     }
};

var command = new Command(); //again created test function, because it doesn't have a prototype
command.run();
command.test();
如果在函数内部的函数原型上设置
run()
函数,则每次运行函数时都会重新定义该函数

这是毫无意义的(因为您可以只定义另一个函数而不是设置原型),效率低下(因为您正在一次又一次地做相同的工作),而且另一个查看您的代码的开发人员不会理解您为什么要这样做,而您本可以在函数之外定义它

这就是为什么你看不到其他人这么做。在原型上的函数外部定义
run()
只定义一次。这是惯用的JS,例如


我不知道这样做有任何技术问题。

我不太理解你的问题-你的代码是否有效?是的,它有效,我的问题是,如果在函数中使用原型是一个问题,所有关于此主题的参考都在主函数之外使用原型。@Nirgensswo:不,它不起作用。试着在多个实例中使用它,然后看到它失败。我有,没有问题,我已经多次创建了它。但真正的问题是,每次原型都会重新定义,这是对空间的一点浪费;-)@Bergi啊,现在我明白你的意思了,“文本”在所有实例中都有相同的值,如果我改变他,所有实例都会共享它。谢谢你的评论:)我知道,但我的问题是,我在函数中使用原型有什么问题吗。关于这个主题的所有参考文献都使用了主函数之外的原型。我知道,但我的问题是,我在函数中使用原型有什么问题吗。关于此主题的所有参考文献都使用了主功能之外的原型。@nirgendswo不,没有问题。但是,如果原型位于函数内部,则每次创建新的命令对象时,都会重新定义原型。如果您只创建一次,那么它就不重要了。如果你创造了很多,那么这将是一个不同,但边际。如果你正在制造数以百万计的测试函数,那么就要避免它。@Blindman67因此,从你上面的评论来看,你的测试函数相当于以几种特定的方式运行function。当我们试图创建一个新对象时,test函数也会创建一个新对象。对吗?还有-run_uu“你总是重写的函数我说的对吗?”@Blindman67:这是一个很大的问题,但显然没有人看到它。@Bergi使用prototype定义方法和分配属性是迄今为止定义对象最低效的方法。闭包的使用是有效的,并且在我看来是javascript对象结构的一个重要部分,使用闭包确实会产生额外的开销,但这是很小的(考虑到任何原型的开销)。隐藏属性(私有)旨在保护对象不被错误使用,是良好设计的重要组成部分。在没有任何理由或解释的情况下说明存在“巨大”问题,对任何人都没有好处,也会损害本网站的专业性。顺便说一句,我可以理解为什么以你现在的方式定义一个函数会感觉更自然——ES6类为你提供了比原型机制更为经典的OO感觉的语法甜点。这是更多的结构,以及私有函数和参数的使用的主要原因。ES6很好,但不适用于每个项目;-)啊。。好的-当你向原型中添加一个东西时,无论它在哪里完成,它都不是私有的。在闭包中定义东西通常是在JS中获得隐私的方式。