Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:在构造函数中定义函数而不是使用原型-有什么区别?_Javascript_Typescript - Fatal编程技术网

JavaScript:在构造函数中定义函数而不是使用原型-有什么区别?

JavaScript:在构造函数中定义函数而不是使用原型-有什么区别?,javascript,typescript,Javascript,Typescript,所以,我不是JavaScript专家,只是想了解下面两段代码之间的区别。我有一个项目,我想转换成TypeScript,我需要了解两个代码段之间的差异正在生成 var Pony = (function () { function Pony() { } Pony.prototype.bite = function () { alert("Chomp!"); }; return Pony; })(); var Pony2 = (function ()

所以,我不是JavaScript专家,只是想了解下面两段代码之间的区别。我有一个项目,我想转换成TypeScript,我需要了解两个代码段之间的差异正在生成

var Pony = (function () {
    function Pony() { }
    Pony.prototype.bite = function () {
        alert("Chomp!");
    };
    return Pony;
})();

var Pony2 = (function () {
    function Pony2() {
        var self = this;
        self.bite = function () {
            alert("Chomp!");
        };
    }
    return Pony2;
})();

两者之间的区别在于,您可以通过var-Pony中存储的对象上的属性获得第一匹小马的原型,并且可以在其他地方扩展或使用该原型的相关位,而as-Pony2只是一个函数。因此,如果您以后不打算使用任何类型的原型继承,那么它们是等价的

至于如何使用它们,没有区别。然而,从性能角度来看,前一种方法更可取。让我们稍微扩展一下您的示例:

var prototypePony1 = new Pony();
var prototypePony2 = new Pony();
var thisPony1 = new Pony2();
var thisPony2 = new Pony2();

prototypePony1.hasOwnProperty('bite'); //returns false
prototypePony2.hasOwnProperty('bite'); //returns false
thisPony1.hasOwnProperty('bite'); //returns true
thisPony2.hasOwnProperty('bite'); //returns true

Pony.prototype.bite = function() { alert('Nomnomnom!'); };
Pony2.prototype.bite = function() { alert('Nomnomnom!'); };

prototypePony1.bite(); //alerts 'Nomnomnom!'   
prototypePony2.bite(); //alerts 'Nomnomnom!'

thisPony1.bite(); //alerts 'Chomp!', instance property is accessed first   
delete thisPony2.bite;
thisPony2.hasOwnProperty('bite'); //returns false
thisPony2.bite(); //alerts 'Nomnomnom!'
在上面的示例中,
thisPony1
thisPony2
都获得了自己的
bite
函数副本,因为它是使用
this
定义的。然而,
prototypePony1
prototypePony2
都共享来自
Pony
构造函数的
bite
的相同副本。

一旦我们在Pony2上定义了
bite
原型,实例属性仍然首先在
thisPony1
上访问。直到删除实例属性,我们才在
thisPony2
上看到新定义的原型属性


有关定义对象方法的更多详细信息,请查看。

上面的答案很好地概括了使用原型和使用实例之间的区别。至于您关于转换为TypeScript的问题,以下是您将如何编写它们:

class Pony {
    bite(){
        alert('chomp');
    }
}

class Pony2 {
    bite:  () => void;
    constructor(){
        this.bite = () => alert('chomp');
    }
}

更多:,不要让OP代码中立即执行的函数欺骗你。变量
Pony
Pony2
是构造函数,可用于创建多个实例。这不是“一次性的事”,读得太快了。忘了我的“新”也在相应地编辑。根据你的链接,是不是相反,pony2a和pony2b有自己的副本,而pony1a和pony1b共享。我今天早上没有喝咖啡,我的变量倒过来了。请再看一看。所以,也总结一下,如果我理解正确,如果会有某种继承,那么原型就是要使用的,如果会有许多相同类型的实例(为了性能)。否则,与ViewModel的情况一样,有一个实例没有任何继承,它几乎是相同的。对的