我有一个包含多种方法的javascript对象。但是我注意到有关方法定义方式的一些不一致。
这是对象:
function MenuObject(containerId, skin) {
this.id = containerId;
this.something = something2;
.
.
.
this.anotherThing = anotherThing2;
this.setSkin = function(skin) { //We have a function here
//body...
{
}
MenuObject.prototype.getTopLevelPolygon = function() //Another function.
{
var p = this.something3;
//Method body goes here...
}
某些功能定义为 this.functionName = function(),其他功能如 MenuObject.prototype.functionName = function()
我只是想知道为什么属于MenuObject的所有函数都定义为MenuObject.prototype.functionName = function()?
答案 0 :(得分:2)
如果你没有使用私有实例变量,通常使用原型定义方法会更有效,因为它们被javascript内部(通过原型)一次性分配给新对象,而不是单独分配给一个在你自己的代码中的时间。
并且,良好的编码实践会说你不应该使用混合方法,除非有特定的理由这样做(并且这段代码并没有表明使用混合的任何特殊原因)。
当您希望它们能够访问私有实例变量时,有理由在构造函数中分配方法:
function MenuObject(containerId, skin) {
var myPrivateVariable = 0;
this.setSkin = function(skin) {
// method can access myPrivateVariable here,
// but a method put on the prototype cannot access it
}
}
您可以在此处详细了解私有实例变量:http://javascript.crockford.com/private.html
答案 1 :(得分:1)
嗯,简短的回答是在构造函数中分配了this.functionName = function()
的项是按需创建的,而使用prototype
创建的项更像是静态函数,因为它们存在于实例之外“函数”是基于程序执行而构建的,与实例化时相反。不一致是有意的或是初级编程的产物(可能是早期的)。
编辑:
顺便说一下,还有更多的东西,但细节一直在继续,有一件事只是浮现在脑海中,它还允许你在“类”里面有“私人”功能,如果你让它我称之为。您还可以通过以下方式定义原型对象:
SomeFunction.prototype = {
SomeFn1:function(){},
SomeFn2:function(){},
SomeFn3:function(){} // etc etc
};
答案 2 :(得分:1)
区别在于您何时要将公共函数添加到对象。
this.functionName = function()
方法要求您在声明对象function MenuObject(containerId, skin) { ... };
时定义所有对象函数。
MenuObject.prototype.functionName = function()
方法允许您在早先声明对象之后向对象添加其他函数。有点像为不同情况添加插件或扩充对象。
答案 3 :(得分:1)
在构造函数中定义方法(this.method = fun ..)可以通过使用闭包来使用“私有”数据。此外,每次调用构造函数时,都会创建构造函数内的方法。如果在调用构造函数时不使用“new”,则“this”通常附加到全局窗口对象,因此可能导致非常混乱和误解的错误。
在构造函数之外定义方法(MenuObj.prototype.method = fun ..)可以随后在代码中被覆盖,而构造函数内部的定义始终优先,并且不能被原型修改覆盖。编辑原型会影响原型链,并可能导致非常混乱和误解的错误。
我建议阅读Douglas Crockford的书籍或访问他的网站http://www.crockford.com/并查看有关JavaScript的视频和论文。