Javascript OOP and Inheritance Technique
Possible Duplicate:
Preserving a reference to"this" in JavaScript prototype functions
我不擅长英语。请理解
当我的朋友有javascript OOP实现时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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(); |
但我想知道以下几点。
1 2 3 4 5 6 7 8 9 | 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(); |
你认为你是谁?
参数
你的朋友们:
为什么要将参数重新分配到"u"版本?这些参数用于我所知道的与局部变量相同的所有意图和目的。
你的:
为什么你觉得有必要公开这些参数?如果这些值只与对象实例有关,那么它们应该保持局部变量。只要对象存在并且不必是属性,它们就会存在。
原型
为什么在这里使用原型?有很多很好的理由,但是我首先使用
新函数()对
我通常只为数据保留对象,或者简单结构类型的对象,这些对象更多地是实用方法的集合,而不是正确的OOP构造。但是,一旦我建模了一些需要保持状态的东西,我通常会使用函数构造函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 | var sleepyInstance = new function(){ var activeState = true; this.sleep = function(){ activeState = false; } this.doSomething = function(){ if(activeState){ alert ('did something!'); } else { alert('ZZZZZzzz'); } } } |
原型更好地用于对象工厂、使用"this"覆盖默认原型方法和继承等方面。如果您不确定某个属性是否需要公开,请将其设置为变量。如果您不确定为什么要使用原型,只需使用"this"将该方法直接附加到实例。原型通常对以不同方式构建类似对象最有意义。
他们有些不同。在第一种情况下:
1 2 | function Item (a, b, c) { var _a = a, _b = b, _c = c; |
不需要第二行,
1 | function Item (_a, _b, _c) { |
正如其他人所指出的,它应该在没有
在第二个方面:
1 2 | function Item (a, b, c) { this.a = a, this.b = b, this.c = c; |
新对象将具有公共的
这只是一个很短的步骤,模块模式由理查德·康福德等人开发,并由道格拉斯·克罗克福德推广。