/*判斷類型*/ function show(x){ /*undefined,number,string,boolean屬於簡單的值類型,值類型的判斷用typeof*/ console.log(typeof x);//undefined console.log(typeof 10);//number console.log(typeof 'abc');//string console.log(typeof true);//boolean /*函數,數組,對象,null,new Number(10)都是對象,都是引用類型,引用類型的判斷用instanceof*/ /*一切引用類型都是對象*/ console.log(typeof function(){});//function console.log(typeof [1,'a',true]);//object console.log(typeof {a:10,b:20});//object console.log(typeof null);//object console.log(typeof new Number(10));//object console.log(function(){} instanceof Object);//true console.log( [1,'a',true] instanceof Object);//true console.log({a:10,b:20} instanceof Object);//true console.log(null instanceof Object);//false console.log(new Number(10) instanceof Object);//true } /*對象都是經過函數建立的*/ var obj={a:10,b:2}; var obj=new Object();/*代碼的本質*/ obj.a=10; obj.b=20; /*每一個函數都有一個屬性叫prototype,這個prototype的屬性值是一個對象(屬性的集合) * 默認的只有一個叫作constructor的屬性指向這個函數自己*/ function name(){ console.log(555) } name.prototype.liuhao=function(){ console.log(555555) } console.log(name.prototype)/ console.log(name.prototype.constructor) /*Fn是一個函數,fn對象是從Fn函數new出來的,這樣fn對象就能夠調用Fn.prototype中的屬性*/ function Fn(){} Fn.prototype.name="liuhao"; Fn.prototype.getYear=function(){ return 1998; } var fn=new Fn(); console.log(fn.name) console.log(fn.__proto__===Fn.prototype)//__proto__:隱式原型 /*每一個函數function都有一個prototype,即原型。每一個對象都有一個__proto__,隱式原型*/ /*每一個對象都有一個__proto__屬性,指向建立該對象的函數的prototype*/ /*Object.prototype確是一個特例--它的__proto__指向的是null*/ /*函數是誰建立出來的--是Function*/ function fn2(x,y){ return x+y; } console.log(fn2(1,2)); var fn1=new Function("x",'y',"return x+y");
/*instanceof A instanceof B* instanceof 的判斷規則是:沿着A的__proto__這條線來找,同時沿着B的prototype* 這條線來找,若是這兩條線能找到同一個引用,即同一個對象,那麼就返回true* 若是找到終點還未重合,則返回false* instanceof 表示的就是一種繼承關係,或者原型鏈的結構* 訪問一個對象的屬性時,先在基本屬性中查找,若是沒有,再沿着__proto__這條鏈* 向上找,這就是原型鏈* */