可能重复:
Preserving a reference to “this” in JavaScript prototype functions
我不擅长英语。请理解
当我的朋友有javascript oop工具
时function Item (a, b, c) {
var _a = a, _b = b, _c = c;
return {
init: function () {
...
},
start: function () {
....
}
}
}
var item = new Item();
item.init();
item.start();
但我想知道以下内容。
function Item (a, b, c) {
this.a = a, this.b = b, this.c = c;
}
Item.prototype.init = function () {...}
Item.prototype.start = function () {...}
var item = new Item();
item.init();
item.start();
你认为你是谁?
答案 0 :(得分:1)
他们有一些差异。在第一种情况下:
function Item (a, b, c) {
var _a = a, _b = b, _c = c;
不需要第二行,a
,b
,c
已经是闭包中保存的局部变量,因此模拟私有变量。它可以写成:
function Item (_a, _b, _c) {
正如其他人所指出的那样,应该在没有new
的情况下调用它。
在第二个:
function Item (a, b, c) {
this.a = a, this.b = b, this.c = c;
新对象将包含公开a
,b
,c
属性。它只取决于您的要求是否需要私人成员(罕见)或需要继承(这是相当常见的)。通常单个单元就足够了,因此普通对象可以使用第一个模式。
由module pattern开发的Richard Cornford et al只有很短的一步,并由Douglas Crockford推广。
答案 1 :(得分:1)
<强>参数强>
你的朋友:
为什么将params重新分配给'_'版本?这些参数用于所有意图和目的,我知道与本地var相同的东西。
此致:
为什么您觉得需要公开这些参数?如果这些值仅对对象实例有影响,则它们应保留在本地变量中。只要对象存在,它们就会存在,而不必是属性。
<强>原型强>
为什么在这里使用原型?有很多好的理由,但我首先使用this.method
,因为它可以访问构造函数中定义的局部变量。原型方法不能。
新功能(){}与{}
我主要为仅数据保留{}对象,或者简单的结构类型对象,它们是比正确的OOP结构更多的实用程序方法集合。但是一旦我在建模需要维护状态的东西,我通常会使用函数构造函数:
var sleepyInstance = new function(){
var activeState = true;
this.sleep = function(){
activeState = false;
}
this.doSomething = function(){
if(activeState){ alert ('did something!'); }
else { alert('ZZZZZzzz'); }
}
}
Prototype更适用于对象工厂,使用'this'覆盖默认原型方法和继承。如果您不确定某个房产是否需要曝光,请将其变为var。如果您不确定为什么要使用原型,只需将方法直接附加到带有'this'的实例。原型通常以不同方式构建类似对象最有意义。