首先理解call,call是javascript中一个很重要的部分,是对象继承的一个重要部分
/*
* 由于在js中首先建立的是函数,因此可以在一个函数中
* 调用其他函数的构造函数,完成赋值
*/
function setName(name){
this.name = name;
this.say = function(){
alert("I'm" + this.name);
}
}
function parent(name){
this.method = setName;
this.method(name);
delete this.method;
}
new parent("张三").say();
在这个例子中间,看到实际上是在parent中定义一个属性,然后将setName这个函数的地址拷贝给它
然后就将setName变成了一个本地的函数,使用this.调用,确保name的上下文是属于parent的
/*
* 由于在js中首先建立的是函数,因此可以在一个函数中
* 调用其他函数的构造函数,完成赋值
*/
function setName(name){
this.name = name;
this.say = function(){
alert("I'm" + this.name);
}
}
function parent(name){
this.method = setName(name);
//this.method(name);
delete this.method;
}
new parent("张三").say();
使用这样的方法发现say是未定义的,因为在调用setName的时候,上下文是window没有被指定为parent
call和以前的继承非常类似
function Parent(name){
this.name = name;
//alert(this.prototype);
//注意这里不能使用this.prototype因为Parent一但被实例化
//以后没有Prototype属性,只有不能被主动访问的_prop_属性
//if(!Parent.prototype.say){ //也不能使用原型来进行内部的方法定义
this.say = function(){ //因为call是改变关键字this,但是在这里
alert(this.name); //直接使用parent,所以就不行了
}
//}
}
function Children(name){
Parent.call(this,name);
}
var c = new Children("lisi");
alert(c.prototype);