原型显示模式以及在嵌套函数或返回对象中使用'this'

时间:2013-11-03 07:51:55

标签: javascript

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

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

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

我理解为什么(我认为),但我不知道如何传递正确的'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'这是可能的例如who.says.jim.apply(谁)

3 个答案:

答案 0 :(得分: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!"

This tells you why this works now!

答案 1 :(得分:0)

当您致电new WhoSays().says.jim()时,thisnew WhoSays().says,而不是您想要的new 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

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

答案 2 :(得分: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