求教一个js面试题

var title = "aaa";
var myclass = function(){}

myclass.title = "bbb";
myclass.prototype.getTitle = function(){
    function doGetTitle(){
        return this.title;
    }
    return doGetTitle.call(this);
}

var obj = new myclass();
console.log(obj.getTitle());

console为什么输出undefined呢?我以为是‘aaa’,我的理解是闭包内部函数里的this指向全局的widow

阅读 4k
10 个回答

但getTitle里的this并不是指向全局,用了call(this),把doGetTitle里的this绑定到obj身上了。

myclass.prototype.getTitle = function(){
    function doGetTitle(){
        return this.title;
    }
    return doGetTitle.call(this);//注意这里用了call(this),而这里的调用obj.getTitle的时候,这里this还是指向obj的
}

另外补充一点是myclass.title="bbb"只是给myclass这个对象赋了title属性,但new myclass()得到的对象是没有title属性的,于是 console 输出undefined

我的理解,多多指教:
1.构造函数和new
2.call的应用

new myclass()的时候并没有title这个属性
原型中getTitle里面实际执行的是(function doGetTitle(){})(),this指向的是函数本身

由于原型中没有title这个属性,所以obj.title为undefined,所以obj.getTitle()也是undefined。

doGetTitle.call(this)修改了this 而原型方法中的this指向的是的实例对象
obj并没有title这个属性 myclass.title = "bbb";没有被继承

var title = "aaa";
var myclass = function(){this.title='bbb'}

myclass.prototype.getTitle = function(){
    function doGetTitle(){
        return this.title;
    }
    return doGetTitle.call(this);
}

var obj = new myclass();
console.log(obj.getTitle()); //bbb

谢邀。

闭包内部函数里this的确指向全局,但.call()方法把this绑定到myclass.prototype.getTitle函数内部,该函数没有声明变量title所以undefined

这个地方的this指向的是原型对象,不是原型,也就是实例,原型对象中不存在title这个属性

var fun = function (){};
  fun.title = 'aa';
  fun.prototype.getTitle = function (){
    var that = this;
    function doGet(){
      return that.title;
    }
    return doGet();
  }
var o = new fun();
o.title = 'cc';
o.getTitle();//'cc'

应该是obj没有继承到myClass的title属性。doGetTitle里面的this指向的是obj

这里的问题是原型继承的知识点。
因为new 出来函数 ,在函数内部产生一个对象,函数内的this指向这个对象。
var obj = new myclass(); 这个函数内的this就指向了obj。
return doGetTitle.call(this);把this指向交给了函数本身,也就是obj。

   var title = "aaa"; // 全局变量 即Window对象的属性
    var myclass = function(){} //具名函数 myclass
    //   myclass.title = "bbb";  //  myclass的私有属性
    myclass.prototype.title = "bbb"; //  myclass的原型属性(公共属性)
    myclass.prototype.getTitle = function(){  // myclass的原型方法
        function doGetTitle(){
            return this.title;  // this指向 doGetTitle()实例化对象
        }
        return doGetTitle.call(this); 
        // this指向改变为  myclass.prototype.getTitle 实例化对象
    };

    var obj = new myclass(); // 实例化对象 
    obj.getTitle() // 实例化对象 中找不到title 通过原型链找到原型中有title = "bbb"
    console.log(obj.getTitle());// bbb

你应该了解一下构造函数和原型的区别

var title = "aaa";
var myclass = function(){}

myclass.prototype.title = "bbb"; // 这里改为原型赋值才能被new的myclass获取到
// myclass.title = "bbb";
myclass.prototype.getTitle = function(){
    console.log(this);
    function doGetTitle(){
        console.log(this);
        return this.title;
    }
    return doGetTitle.call(this);
}

var obj = new myclass();
console.log(obj.getTitle());
新手上路,请多包涵

console.log(obj.getTitle()); 这条语句是obj在调用getTitle(),
所以return doGetTitle.call(this);语句中的this代表obj。
function doGetTitle(){

    return this.title;

}
所以当前的this是指的就是obj,其实return doGetTitle.call(this);这条语句完成可以写成return doGetTitle(); 加上call(this)只是用来迷惑你的。

myclass.title = "bbb"; 是myclass对象的私有属性,无法通过new来传递给实例。因为JavaScript是通过原型链来传递属性和方法的。

var title = "aaa";
var myclass = function(){}

myclass.title = "bbb";
myclass.prototype.getTitle = function(){
    function doGetTitle(){
        return this.title;
    }
    return doGetTitle.call(this);
}

var obj = new myclass();
console.log(obj.title);// undefined
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题