2014-01-06 26 views
1
var Todo = function(x){ 
this.data = x; 
    this.view = function(){ 
     alert("hi") 
     check() 
    } 
    check = function(){ 
     alert("checking") 
     alert(this.data) 
    } 
} 
Todo.prototype.add = function(item){ 
    this.data.push(item) 
} 
var todo = new Todo([1,2,3]) 
alert(todo.data) 
todo.add(5) 
alert(todo.data) 
todo.view() 

在上面的代碼中,爲什麼我無法在檢查方法中獲取數據的值。我有點困惑。在javascript中理解原型和哎呀實現

+0

也許下面的答案會對你有幫助:http://stackoverflow.com/a/16063711/1641941正確地回答,函數檢查是window(window.check)的成員,所以當調用'window.check'那麼調用對象是'window'。調用對象是'this'在函數體中表示的內容。 – HMR

回答

1

您已聲明check作爲一個全局變量:

var a = 5; local variable 
a = 5; global variable (attached to window) 

因此,函數上下文(this)調用check()時,不包含data屬性綁定到Window

所以你必須check功能附加到藤堂「課」:

this.check = function() {}; 

一個側面說明,你可以通過調用函數時手動功能方面設置爲todo獲得所需的功能

check.apply(todo); 
3

thischeck函數中指的是全局對象window

var Todo = function(x){ 
    this.data = x; 
    this.view = function(){ 
     alert("hi"); 
     this.check(); 
    }; 
    this.check = function(){ 
     alert("checking"); 
     alert(this.data); 
    }; 
}; 

如果你不想暴露check方法公開,那麼你可以做象下面這樣:

與修復。

var Todo = function(x){ 
    this.data = x; 
    this.view = function(){ 
     alert("hi") 
     check.apply(this); //here, by using apply method 
    } 
    var check = function(){ 
     alert("checking") 
     alert(this.data) 
    } 
} 
+0

是的,我知道,我試過在jsfiddle,但我想知道爲什麼在檢查方法,這是無法訪問?如果我檢查這個檢查方法,它給了我窗口對象。 – jbmyid

+0

@jbmyid'this'的值由函數的調用方式決定。 – xdazz