0

可能重复:
在 JavaScript 原型函数中保留对“this”的引用

我英语说的不好。请理解

当我的朋友有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();

你觉得你是哪个?

4

2 回答 2

1

他们有一些不同。在第一种情况下:

function Item (a, b, c) {
    var _a = a, _b = b, _c = c;

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

function Item (_a, _b, _c) {

正如其他人指出的那样,它应该不带new.

在第二:

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

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

这只是由Richard Cornford等人开发并由 Douglas Crockford 推广的模块模式的一小步。

于 2012-12-13T06:14:35.033 回答
1

参数

你的朋友们:

为什么将参数重新分配给“_”版本?这些参数用于我所知道的与本地变量相同的所有意图和目的。

你的:

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

原型

为什么在这里使用原型?有很多很好的理由,但我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”将该方法直接附加到实例。原型通常最适合以不同的方式构建类似的对象。

于 2012-12-13T06:46:16.687 回答