如何从父级js调用原型

时间:2018-12-12 17:05:44

标签: javascript

Uncaught TypeError: this.rnd is not a function.

在这种情况下该怎么办? 我了解您需要以某种方式使用call方法?

var foo = function () {    		
    var write = function () {
        document.write(this.rnd([1, 3, 5, 7]));   			
    }
    write();
}
	
foo.prototype.rnd = function(array) {
    return array[Math.round(Math.random() * (array.length - 1))];
}

var f = new foo();

3 个答案:

答案 0 :(得分:3)

var foo = function(){
		
	var write = function(ctx) {
		document.write(ctx.rnd([1, 3, 5, 7]));
		
	}

write(this);
}


foo.prototype.rnd = function(array)
{

return array[Math.round(Math.random() * (array.length - 1))];

}


var f = new foo()

答案 1 :(得分:2)

如果要以这种方式进行设置,则可以在实例上定义write,以便可以用this.write()进行调用。每个实例都有自己的函数副本,这通常是不必要的:

var foo = function(){	
    this.write = function() {
        console.log(this.rnd([1, 3, 5, 7]));
        
    }
    this.write();
}


foo.prototype.rnd = function(array){
    return array[Math.round(Math.random() * (array.length - 1))];
}

var f = new foo();

或者,您也可以将write()放在原型上,然后所有实例将共享相同的功能:

var foo = function(){	
    this.write();
}

foo.prototype.write = function() {
    console.log(this.rnd([1, 3, 5, 7]));     
}

foo.prototype.rnd = function(array){
    return array[Math.round(Math.random() * (array.length - 1))];
}

var f = new foo();

如果想要使用call(),则可以这样操作,它将this中的write()手动绑定到实例:

var foo = function () {    		
    var write = function () {
        console.log(this.rnd([1, 3, 5, 7]));   			
    }
    write.call(this);
}
	
foo.prototype.rnd = function(array) {
    return array[Math.round(Math.random() * (array.length - 1))];
}

var f = new foo();

答案 2 :(得分:2)

scope中的this在那里存在问题。下面的代码可以工作

var foo = function(){   
    var currentThis = this
    var write = function() {
        document.write(currentThis.rnd([1, 3, 5, 7]));

    }
    write();
}


foo.prototype.rnd = function(array)
{

return array[Math.round(Math.random() * (array.length - 1))];

}


var f = new foo();

这里的问题是,到您写这篇文章的时候,这和foo构造函数的含义不一样。 当您学习香草javascript时,您可能会发现人们也在做

var self = this
var that = this