问题:怎么理解setTimeout的延时执行
描述:我想通过执行改变函数原型的构造属性查看new方法的具体使用,但是在触发changAs()
之后,我发现位于changAs()
语句之前的console.log(new As());
触发的显示中构造函数已经被改变
答案:
1. setTimeout无效的原因是因为语法错误
2. 控制台打印错误的结果是因为在chrome的环境下,console.log()函数虽然不是异步函数,但是会产生堵塞i/o,所以打印的结果和异步产生的结果是一样的,要注意的是,这并不代表在chrome下console.log()是异步函数,只是会产生这样的结果,而且是可避免的
然后我打算利用setTimeout触发延时执行产生异步,但是无效
渴望的回答:
- setTimeout在这里为什么会无效
- 希望能解释为什么会出现后触发先执行但结果依然被改变
十分感谢
代码:
function As() {
c = function(){
console.log("摇曳露营no.1");
};
a = 1 ;
a = 2;
return this;
};
As.prototype.As = "小不点no.1";
As.prototype.c = function(){
console.log("小南极no.1");
};
console.log(As);
console.log(typeof(As));
var s1 = As;
console.log(s1); //仅仅是方法的字变量给赋值了
console.log(As()); //返回window对象,如果去掉return就会产生undefined,因为没有返回值
console.log(As.prototype);
As().c(); //摇曳露营no.1 //既然没有返回值,underined.c()肯定找不到
console.log(As().a); //私有属性 ,如果a定义在函数内部,即私有属性,window里是找不到的
console.log(new As()); //这里触发
new As().c(); //小南极no.1
new new As().c(); //小南极no.1
console.log(new As().As); //小不点no.1
function changeAs(){
console.log("改变");
As.prototype.constructor = function(){
this.d = function(){
console.log("京紫no.1");
}
return this;
}}
setTimeout(changeAs(), 2000);
console.log(new As());
先看setTimeout的函数签名...
setTimeout 第一个参数是function
楼主的代码传入的是changeAs的返回值... 这里应该是 void
可以尝试改成这样
或者
问题2:
https://developer.mozilla.org...
constructor 在其他语言是构造函数,相当于 new 的时候会触发的一个hook, 但是在js中....并不会起到这种作用.. 应该直接AS = function(){} 去改变构造函数
建议楼主多补充点基础知识