this.method=函数(){}VS obj.prototype.method=函数(



作为一名c#/.net开发人员,我喜欢在业余时间摆弄JavaScript——创建自己的库/框架等等。诚然,它们并不多(实际上只不过是一个松散的函数集合(,但目的是学习;不供其他人使用。

我通常这样扩展一个基本的JavaScript对象

obj = function () {
    //basic object stuff
    this.method = function () {
        //other stuff
    };
    return this;
};

这允许我一起创建其他对象和链式方法,这真的很巧妙:

obj('arg1').method();

两个例子:jQuery Knock-off,List Item Sorter

然而,我最近看到,在比我自己的功能代码多得多的功能代码中,对象以这种方式实现了相同的功能:

function obj(){
    //stuff
}
obj.prototype.method = function () {
    //stuff
};

示例:Reddit Chrome扩展

两种方法似乎都达到了相同的目的,我并不偏爱这两种语法。有没有一种特殊的情况,其中一种会比另一种更有用?这些方法提供了什么,使它们比其他方法更受欢迎?

编辑

考虑以下代码:

var dice = function (sides) {
    this.roll(){
        return 4 //guaranteed to be random
    }
};
var d1 = dice(6);
d1.roll()  // 4;
var d2 = dice(20);
d2.roll()  // 4

在我看来,d1和d2是不同的物体吗?或者它们是指向一个对象的指针/昵称(var dice(?

this.method = function(){};

仅适用于该特定实例。

Obj.prototype.method = function(){};

适用于Obj 的每个实例

尽管为了利用prototype,你应该进行

var o = new Obj(); // Note that functions intended to be used with "new" should be capitalized
o.method();

骰子示例

我假设您打算在dice()函数中使用return this

这个例子并不常见,因为调用函数不会创建新对象。在骰子的情况下,您将为this分配一个方法,该方法在函数中是全局对象window,然后返回它

结果将是d1d2中的相同对象(window(,方法roll将在第二次调用中重新分配。

为了实现您想要的,您应该使用new创建实例,如下所示:

var d1 = new Dice(6); // remember capitalization is important here
var d2 = new Dice(20); 

然而,这将创建2个roll函数,这是正确的,但浪费内存,因为该函数可以通过执行以下操作共享:

Dice.prototype.roll = function() { /* return random awesomeness */ };

希望能澄清

相关内容

最新更新