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)
两种方式似乎都达到了同样的目的,而且我不会偏向任何一种语法.是否存在一种比另一种更有用的特殊情况?这些方法提供了什么使它们比另一种更令人满意?
编辑
请考虑以下代码:
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)
希望澄清事情