0

因此,我不是 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;
})();
4

3 回答 3

0

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

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

class Pony2 {
    bite:  () => void;
    constructor(){
        this.bite = () => alert('chomp');
    }
}
于 2013-03-29T15:40:47.383 回答
0

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

于 2013-03-29T14:26:09.547 回答
0

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

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并且都共享from的构造函数prototypePony2的相同副本。 一旦我们在 Pony2 上定义了原型,实例属性仍然会首先在. 直到我们删除实例属性,我们才看到新定义的原型属性。 有关定义对象方法的更多详细信息,请查看此处bitePony

bitethisPony1thisPony2

于 2013-03-29T14:31:43.663 回答