作为一个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
};
两种方式似乎都达到了同样的目的,而且我不会偏向任何一种语法。是否存在一种比另一种更有用的特殊情况?这些方法提供了什么使它们比另一种更令人满意?
修改
请考虑以下代码:
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)的指针/昵称?
答案 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
全局对象,然后返回它。
结果将是window
和d1
中的同一对象(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 */ };
希望澄清事情