就良好实践而言,带闭包的javascript原型是一件好事吗
is javascript prototype with closure a good thing in terms of good practice
我试着学习javascript几个星期(node.js)。我对.NET有一些初步的了解,但结果证明这是一件坏事。我对javascript的总体理解是:
- 所有的东西都应该放在函数中,我们可以把它们看作类,但不要这样称呼它们
- 函数(方法)应该总是放在原型中,原型是一个类似于我们"类"的每个实例的共享函数,也就是说,为所有实例安装一次
- 闭包是一件好事,它们隐藏了私有方法,它们似乎也会在内存中持续到未知时刻,包含vars
写这篇文章只是为了让你了解我目前对JS的理解,但实际的问题如下:我有一些代码,希望在原型中有一个闭包,因此,我用我不太了解的方式写了一篇关于如何使用javascript的文章。所以,
- 就
而言,带闭包的javascript原型是一件好事吗好的实践,如果是的话,这段代码是一个很好的例子吗 - 为什么我想在我的类构造函数中有"return this"
- 最后,代码no1和no2的组成部分是一样的吗
function createFunctionWithClosure() { // number, and a gensym method that produces unique strings
var prefix = '';
var seq = 0;
return {
set_prefix(p) {
prefix = String(p);
},
set_seq: function(s) {
seq = s;
},
get_unique: function() {
var result = prefix + seq;
seq += 1;
return result;
}
};
}
//example no1
function myclass_t() {
//why some examples have
return this
}
myclass_t.prototype = createFunctionWithClosure();
var myclass = new myclass_t()
myclass.set_prefix('no1--->')
myclass.set_seq(100)
console.log(myclass.get_unique()) //100
console.log(myclass.get_unique()) //101...
//example no2
var myvar = createFunctionWithClosure();
myvar.set_prefix('no2-->')
myvar.set_seq(1000);
myvar.get_unique()
myvar.get_unique()
console.log(myvar.get_unique()) //1002
console.log(myvar.get_unique()) //1003
我确实试着用谷歌搜索了很多,但有些信息(从最近的一些评论来看)有点过时了,可能不再有效了,比如这个关于闭包性能的问题
这不是您问题的直接答案,但我认为您实际需要的是了解javascript中原型继承的基本原理。
这里有一个很好的视频和一个现场游乐场,Mozilla文档也是一个不错的信息来源。
一旦你了解了这些东西,你可能会觉得这是一种"黑客"的做事方式,你是否需要接受这一点,或者转到ES6或一些像TypeScript这样的javascript语言,请参阅这个问题以了解更多信息。
#1就良好实践而言,带闭包的javascript原型是一件好事吗?如果是,这段代码是一个很好的例子吗
闭包是一个函数,它自己的作用域引用来自其他作用域的成员:
// "x" is being referenced on the inline function's scope
var x = "hello world";
var func = function() {
console.log(x);
};
是否是一个好主意,将取决于项目的要求。。。我想说,我很少会走这条路。
#2为什么我想在我的类构造函数中有"return this"
因为某个角落的案子。如果你正在开发一个流畅的接口,你可能想要返回this
,如果整个函数不是从声明它的对象调用的,你会这样做。
例如:
var obj = {
doStuff: function() {
return this;
}
doStuff2: function() {
return this;
}
};
// This is a fluent interface
obj.doStuff().doStuff2();
在构造函数中,返回this
是无用的,除非您也想将整个构造函数调用为正则函数:
var func = function() {
return this;
};
// The whole "return this" won't have any effect
// on this case
var instance = new func();
// With Function.prototype.call, the first parameter
// defines "this" within the scope of the called function.
// That is, it'll return the object with a text property...
var result = func.call({ text: "hello world" });
#最后,代码no1和no2的部分是同一件事吗
没有。
您的第一个示例显示了一个构造函数,其原型是工厂函数返回的对象。
另一方面,第二个示例使用完整的工厂函数将其返回的对象设置为整个变量。
相关文章:
- 当点击另一件事时,将焦点设置为一件事
- 就良好实践而言,带闭包的javascript原型是一件好事吗
- 每一件事都要做点什么
- 做一件事,然后在react js中每隔15秒做一次
- 本应只对一件事起作用的点击会影响所有人
- 如何在包含异步函数的循环之后完成一件事
- 如何从“输入”事件中获取最后一件事输入
- 为什么 JavaScript 返回另一件事而 PHP 返回另一件事
- 用两个不同的元素切换一件事
- 变量的自我引用在 JavaScript 中是一件坏事吗?
- 何时使用“原型”一词向 javascript 中的对象添加新属性
- 重构JavaScript事件处理程序 - 这是一件合理的事情吗?
- CSS选择器允许一件事而不允许另一件事
- 在我必须做的一件简单的事情中,赋值中的左侧无效
- 把一件事放在清单的最上面
- 如何判断setInterval是否是阻止应用退出的最后一件事
- javascript中太多的自调用函数是不是一件坏事?
- 太多的阿贾克斯是一件坏事吗?
- 展示了一件东西之后,就剩下jQuery了
- Javascript代码检查URL内容,只保留一件事