/*1.方法調用模式: 先定義一個對象,而後在對象的屬性中定義方法,經過myobject.property來執行方法,this即指當前的myobject 對象。*/ var car = { carId:123, carName:"奧迪", carColor:"red", say:function(){ console.log(this.carName+" color is "+this.carColor); } }; car.say(); /*2.函數調用模式 定義一個函數,設置一個變量名保存函數,這時this指向到window對象。*/ var mycar = function(name,color){ return "my car is " +color+" and "+name ; } console.log(mycar("奧迪","紅色")); /*3.構造器調用模式 定義一個函數對象,在對象中定義屬性,在其原型對象中定義方法。在使用prototype的方法時,必須實例化該對象才能調用其方法。*/ var yourcar = function(name,color){ this.name = name; this.color = color; }; yourcar.prototype ={ say:function(){ console.log("your car is " +this.name + " and " +this.color); } }; var yourcar = new yourcar("奔馳","藍色"); yourcar.say(); /*4.apply,call調用模式*/ function count(num1, num2) { return num1 + num2; } console.log(count.call(window, 10, 10)); //20 console.log(count.apply(window,[10,20])); //30 window.a=100; window.b=300; var myobject={a:40,b:50}; var sum = function(){ return this.a+this.b; }; var sum1 = sum.call(window); // var sum2 = sum.call(myobject); var sum2 = sum.apply(myobject); console.log(sum1+"========="+sum2); // 發現apply()和call()的真正用武之地是可以擴充函數賴以運行的做用域,若是咱們想用傳統的方法實現 window.a=100; window.b=300; var myobject={a:40,b:50}; function sum(){ console.log(this.a+this.b); } console.log(sum()); myobject.sumnumber = sum; console.log(myobject.sumnumber()); window.color = "red"; var o = { color: "blue" }; function sayColor(){ console.log(this.color); } sayColor(); var OSayColor = sayColor.bind(o); OSayColor(); //blue