1. 程式人生 > >js---13 this call apply

js---13 this call apply

是個 動態改變 turn new argument this instance 調用函數 對象

<script type="text/javascript">
//this:this可以寫在js全劇環境中(全局環境中this是window對象),this可以寫在函數中,可以寫在對象中,
function f(){
     this.name = "asdfas";
}
var o ={
    name :"cj",
     print:function(){
        console.log(this.name);
    }
};
o.print();//cj
var f = o.print();//java的內存分析模型來分析js內存模型。函數是函數對象,f就指向print指向的函數對象,
f();//undefined, /*this是運行時決定不是代碼寫的時候決定,this寫在函數中,哪個對象調用函數,這個對象就看成這個函數類的實例化對象,this就指向那個對象, f() === window.f(),所以未定義。 */ var ele = document.getElementById("id"); ele.addEventListener("click",function(){ console.log(this);//this永遠指向dom元素,就是引發事件的對象, }) //call,apply都是函數對象有的,動態改變函數調用的對象 function log(a){ console.log(
this[a]); } log("name"); //this是window對象,global log.call(o,"name");//cj,相當於o.log("name"),不讓window調用log函數讓o來調用log函數,call方法第一個參數是要調用這個函數的對象,第二個是參數。 function log(a,b){ console.log(this[a]);//通過中括號訪問函數對象的成員屬性, console.log(this[b]); } log("name",""); log.apply(o,"name","age"); log.apply(o,["name","age"]); //
apply接受參數是數組,call是一個一個傳遞 log.call(this,) == this.log() function p(){ this.name = "111";//函數的this是調用這個函數的對象 } var o ={}; p.call(o);//相當於o.p(),調用函數看成是類的構造器執行了,那麽此時o就是函數這類的實例化對象,就有了這個類的屬性了,this就指向o, console.log(o.name); // 111 function Person(name,age){ this.name = name; this.age = age; } var p1 = new Person ("cj",22);//new出來的,當然p1就是這個函數類的實例化對象 console.log(p1 instanceof Person); //true //自定義new function New(f){ //f 是個函數。f 構造器函數 var o = {"__proto__":f.prototype}; //o.__proto__ 指向函數f的prototype return function(){//返回函數,可以不寫形參, //o.name = arguments[0]; //o.age = arguments[1]; f.apply(o,arguments);//o調用f,類的構造器執行,那麽o就是函數f的實例化對象了,就有了這個類的屬性和值 return o;//函數執行時返回o對象 } } var p2 = New(Person)("xx",33);//New(Person)返回函數,("xx",33)函數執行返回o console.log(p2.name);//xx console.log(p2 instanceof Person);//true </script>

js---13 this call apply