了解javascript中的原型设计和oops实现

时间:2014-01-06 11:28:14

标签: javascript prototype

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()

在上面的代码中,为什么我无法在check方法中获取数据的值。我有点困惑。

2 个答案:

答案 0 :(得分:3)

this函数中的

check引用全局对象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)
    }
}

答案 1 :(得分:1)

您已将check声明为全局变量:

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

因此,函数上下文(this)在调用Window时绑定到check()data不包含check属性。

所以你必须将this.check = function() {}; 函数附加到Todo“class”:

todo

旁注,您可以通过在调用函数时手动将函数上下文设置为check.apply(todo); 来获得所需的功能:

{{1}}