Javascript OOP和继承技术

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"版本?这些参数用于我所知道的与局部变量相同的所有意图和目的。

你的:

为什么你觉得有必要公开这些参数?如果这些值只与对象实例有关,那么它们应该保持局部变量。只要对象存在并且不必是属性,它们就会存在。

原型

为什么在这里使用原型?有很多很好的理由,但是我首先使用this.method,因为它可以访问在构造函数中定义的本地var。原型方法不能。

新函数()对

我通常只为数据保留对象,或者简单结构类型的对象,这些对象更多地是实用方法的集合,而不是正确的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;

不需要第二行,abc已经是闭包中的局部变量,因此可以模拟私有变量。可以这样写:

1
function Item (_a, _b, _c) {

正如其他人所指出的,它应该在没有new的情况下被调用。

在第二个方面:

1
2
function Item (a, b, c) {
    this.a = a, this.b = b, this.c = c;

新对象将具有公共的abc属性。它仅仅取决于您的需求,您是需要私有成员(很少)还是需要继承(不需要继承是很常见的)。通常一个单例就足够了,所以一个普通的对象就足够了,您可以使用第一个模式。

这只是一个很短的步骤,模块模式由理查德·康福德等人开发,并由道格拉斯·克罗克福德推广。