this.method = function(){} VS obj.prototype.method = function(){}

Mic*_*per 3 javascript function object

作为ac#/ .net dev,我喜欢在业余时间玩JavaScript - 创建我自己的库/框架等.不可否认,它们并不多(实际上只不过是松散的功能集合),但其目的是学习; 不供其他人使用.

我通常以这种方式扩展一个基本的JavaScript对象

obj = function () {
    //basic object stuff
    this.method = function () {
        //other stuff
    };
    return this;
};
Run Code Online (Sandbox Code Playgroud)

这允许我一起创建其他对象和链方法,这非常灵活:

obj('arg1').method();
Run Code Online (Sandbox Code Playgroud)

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

但是,我最近看到,在比我自己更多的功能代码中,对象通过这种方式实现了相同的功能:

function obj(){
    //stuff
}
obj.prototype.method = function () {
    //stuff
};
Run Code Online (Sandbox Code Playgroud)

示例: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
Run Code Online (Sandbox Code Playgroud)

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

Pab*_*dez 13

this.method = function(){};
Run Code Online (Sandbox Code Playgroud)

仅适用于该特定实例.

Obj.prototype.method = function(){};
Run Code Online (Sandbox Code Playgroud)

将适用于每个实例 Obj

虽然为了利用prototype你应该做的

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

o.method();
Run Code Online (Sandbox Code Playgroud)

骰子示例

我假设你打算return this在你的dice()功能.

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

结果将是两者中的相同object(window),d1并且在第二次调用中将重新分配d2一个方法roll.

为了达到你想要的效果,你应该创建实例new,如下所示:

var d1 = new Dice(6); // remember capitalization is important here
var d2 = new Dice(20); 
Run Code Online (Sandbox Code Playgroud)

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

Dice.prototype.roll = function() { /* return random awesomeness */ };
Run Code Online (Sandbox Code Playgroud)

希望澄清事情