Javascript方法定义不一致
Javascript method definition inconsistency
我有一个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...
}
一些函数像这样定义。functionName = function(),其他如MenuObject.prototype。functionName = function()
我只是想知道为什么不是所有属于MenuObject定义为MenuObject.prototype. functionname = function()的函数?
如果您不使用私有实例变量,使用原型定义方法通常更有效,因为它们是由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
简短的回答是,在构造函数中用this.functionName = function()
赋值的项是按需创建的,而用prototype
创建的项更像静态函数,因为它们存在于"函数"的实例之外,并且在程序执行时构建,而不是在实例化时构建。这些不一致要么是故意的,要么是初级编程的产物(可能是早期的)。
顺便说一下,它甚至比这更多,但细节还在继续,我想到了一件事,它还允许你在"类"中拥有"私有"函数,如果你愿意的话。你也可以这样定义原型对象:
SomeFunction.prototype = {
SomeFn1:function(){},
SomeFn2:function(){},
SomeFn3:function(){} // etc etc
};
在构造函数中定义方法。Method = fun..)可以通过闭包使用"私有"数据。此外,每次调用构造函数时都会创建构造函数中的方法。如果在调用构造函数时不使用'new', 'this'通常会附加到全局窗口对象,因此会导致非常令人困惑和误解的bug。
在构造函数(MenuObj.prototype.)之外定义方法。Method = fun..)可以在以后的代码中随时重写,而在构造函数内部定义总是优先的,并且不能被原型修改所重写。编辑原型会影响原型链,并可能导致非常令人困惑和误解的bug。
我建议阅读Douglas Crockford的书或访问他的网站http://www.crockford.com/并查看有关JavaScript的视频和文章。
不同之处在于您希望何时向对象添加公共函数。
this.functionName = function()
方法要求您在声明对象function MenuObject(containerId, skin) { ... };
时定义所有对象函数。
MenuObject.prototype.functionName = function()
方法允许您在早先声明对象之后向对象添加额外的函数。所以有点像添加插件或者在不同的情况下增加对象
- 当属性不一致时,如何根据属性对JS对象列表进行排序
- Android和JavaScript解析API之间不一致
- Javascript的行为与PHP包含文件不一致
- 对这种与document.domain和CORS相关的不一致行为的解释是什么
- 点击链接行为不一致
- Passport.js`isAuthenticated()`不一致的行为;当它应该是真的时候是假的
- Javascript:继承原型而不重新定义构造函数
- 与显示不一致
- Ext 4.2.1 模型日期解析在浏览器之间不一致
- 通过 Dropbox API 上传时的文件内容不一致
- JavaScript - 对象属性不一致
- Javascript 混淆了 null、instanceof 和 typeof 的语法不一致
- localeCompare 显示使用前导变音字符对单词进行排序时不一致的行为
- ASP.NET MVC - 未捕获的引用错误:即使我包含库,也不会定义jQuery
- 为什么 alert() 在输入不一致的位数后返回未定义
- 包含自定义字体文本的元素的jQuery height()似乎不一致
- null和未定义的不一致比较
- HTML5画布在使用ID选择器定义宽度和高度时执行不一致
- jQuery .each()迭代由HTML类-不一致的行为取决于顺序类定义
- Javascript方法定义不一致