本文收集JS原型相關問題,會不斷跟新!
1、題目如下:
var fun = function(){}
fun.prototype = {
name : 'peter',
age : 25
}
var a = new fun();
var b = new fun();
console.log(a.name, b.name);//peter peter
fun.prototype.name = 'jack';
console.log(a.name, b.name);//jack jack
fun.prototype = {};
fun.prototype.name = 'tom';
console.log(a.name, b.name);//jack jack
b.constructor.prototype.name = 'kitty';
console.log(a.name, b.name);//jack jack
若想要輸出tom該怎麼改,爲什麼不能輸出kitty?答案:
(1)、fun.prototype ={}是重寫原型,重寫後跟重寫前就已經實例化的對象沒有關係的,所以Tom自然不生效。若要輸出tom,添加以下代碼
a.__proto__.name=tom,無法通過fun來實現,因爲原型鏈已斷
(2)、 不能輸出kitty是因爲b.contructor!=fun,在剛開始的時候fun的原型就被重寫了。可以改爲
fun.prototype={
name:''peter'',
constructor:fun,
age:25
}
2、閉包題
function a(){
var i=1
return function(){
console.log(i);//輸出1
console.log(this.i)// 輸出2
}
}
window.i=2;
a()()
解釋:看下圖閉包的作用域鏈