0

我一直在使用 Prototype Revealing Pattern,一个简单的示例如下所示。

如果我返回未注释的对象以从原型函数中公开公共函数,则它工作正常,如此处所示jsFiddle

另一方面,如果我使用另一个嵌套对象(被注释掉的对象)将返回的公共函数组织在不同的层次结构中,则仍然可以调用函数,但 instanceVar 在“this”中未定义

我理解为什么(我认为),但我不确定如何传递正确的“this”实例,或者是否可以使用这种模式,我想知道是否有人知道如何做到这一点?

我已经以多种方式尝试了 .call(this) ,但仍然无法获得任何快乐。

WhoSays = function (sentence) {
    this.instanceVar = sentence;
};

WhoSays.prototype = (function () {

    var jimSays = function () {
        return 'jim says ' + this.instanceVar;
    };
    var bobSays = function () {
        return 'bob says ' + this.instanceVar;
    };

    /*return {
        says : {
            jim : jimSays,
            bob : bobSays
        }
    };*/

    return {
        jim: jimSays,
        bob: bobSays
    };

}());

. 更新:

我不想修改调用,调用者不需要知道如何使用超出显而易见的模式。

我确信这可能不是一个聪明的做事方式,命名空间层次结构可能是一个更好的方法,但如果从调用者的角度来看,如果不使用调用来绑定“this”,我仍然感兴趣,例如谁。说.jim.apply(谁)

4

3 回答 3

1

如果您真的希望它像您尝试的那样工作,请像这样使用它:

WhoSays = function (sentence) {
    this.instanceVar = sentence;
};

WhoSays.prototype = function () {
    var jimSays = function () {
        return 'jim says ' + this.instanceVar;
    };
    var bobSays = function () {
        return 'bob says ' + this.instanceVar;
    };

    return {
        says : {
            jim : jimSays,
            bob : bobSays
        }
    };
    /*
    return {
        jim: jimSays,
        bob: bobSays
    };*/

}();

var who = new WhoSays("works!");
console.log(who.says.jim.apply(who)); // logs "jim says works!"

这告诉你为什么这现在有效!

于 2013-11-03T08:12:14.640 回答
0

当你打电话new WhoSays().says.jim()时,不是this你想要的。new WhoSays().saysnew WhoSays()

你可以试试:

WhoSays.prototype = (function () {
    return {
        says: function() {
            var self = this;
            return {
                jim : function() {
                    return 'jim says ' + self.instanceVar;
                },
                bob : function() {
                    return 'jim says ' + self.instanceVar;
                },
            }
        };
    };
}());

然后调用new WhoSays().says().jim().

或用于Object.defineProperty定义符号偏好的 getter says

我个人的偏好是使用更传统的方式来获得你想要的东西。

于 2013-11-03T07:58:37.530 回答
0

您可以尝试以下代码:

var WhoSays = function (sentence) {
  this.instanceVar = sentence;
  this.says=new Says(this);
};

var Says = function(whoRef) {
  this.whoRef=whoRef;
};
Says.prototype.jim = function () {
  return 'jim says ' + this.whoRef.instanceVar;
};
Says.prototype.bob = function () {
  return 'bob says ' + this.whoRef.instanceVar;
};

var b = new WhoSays("b");
console.log(b.says.jim());
var c = new WhoSays("c");
console.log(c.says.jim());
console.log(b.says.jim());

更多关于原型、继承、覆盖https://stackoverflow.com/a/16063711/1641941

了解this可能是什么:https ://stackoverflow.com/a/19068438/1641941

于 2013-11-03T12:18:40.410 回答