为什么此方法调用不能从原型中工作?



我正在努力学习如何编写更好的javascript,但我不确定为什么这不起作用。我有两个写入文本字段的方法调用。第一个很好用,但第二个不行。为什么在嵌套调用中未定义文本字段变量?任何帮助都将不胜感激:

(function () {
    var TestObj = function (logEl) {
        this.log = logEl;
    };
    TestObj.prototype = function () {
        var log1 = function (text) {
            this.log.val(text);
        };
        var log2 = function (text) {
            log1(text);
        }
        return {
            log1: log1,
            log2: log2
        };
    }();
    $(function () {
        var logEl = $("#log");
        var test = new TestObj(logEl);
        test.log1("This Works");
        test.log2("This Dosen't"); //this.log is undefined
    });
})()

在第二种情况下,在没有任何上下文的情况下调用log1。从log2调用this时的值将是全局对象,而不是TestObj的实例。

尝试将其更改为:

var log2 = function (text) {
    this.log1(text);
}

演示小提琴

我认为问题与log2:中未使用this有关

var log2 = function (text) {
    this.log1(text);
}

小提琴的例子:http://jsfiddle.net/y66YT/

As dc5和Hayes指出this的值是调用对象。它是出现在函数之前的对象:

somebutton.click();//this is somebutton
click();//nothing before click, window is assumed or throw exception in strict mode
myObject.doSomething();//this in doSomething is myObject

由于log1通过闭包可用,它不会立即抛出异常(log1未定义(,但log1函数中的this是窗口,因为log2没有提供调用对象。

要设置调用对象,可以将代码更改为:

 log1.call(this,text);

我不太喜欢在IIFE中扔所有东西,包括厨房水槽,因为它会为每种方法创建不必要的盖子。您可以将应用程序包装为对象文字,并在实际需要闭包的地方使用IIFE:

var app ={
  testObj:function(...

log1不能通过log2中的闭包使用,但您可以使用this 调用它

 this.log1(text);

关于原型、构造函数、继承和this的值的更多信息可以在这里找到。

最新更新