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

时间:2011-08-02 20:56:30

标签: javascript function object

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

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

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

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

obj('arg1').method();

两个示例:jQuery Knock-offList-Item Sorter

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

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

示例:Reddit Chrome Extension

两种方式似乎都达到了同样的目的,而且我不会偏向任何一种语法。是否存在一种比另一种更有用的特殊情况?这些方法提供了什么使它们比另一种更令人满意?

修改

请考虑以下代码:

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)的指针/昵称?

1 个答案:

答案 0 :(得分:13)

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();

骰子示例

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

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

结果将是windowd1中的同一对象(d2),方法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 */ };

希望澄清事情