作为一名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
,然后返回它
结果将是d1
和d2
中的相同对象(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 */ };
希望能澄清