/* * @ call和apply方法 * @ 当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。 * @ (有方法的)对象.call("环境的上下文本对象",参数) * @ 通过call和apply,我们可以实现对象继承。示例 */ /*function product(test){ alert(test); } function log(){ } product.call(log,2);*/ /*function product(test){ alert(test); } function log(){ product.call(this,2); } log();*/ function Product(name, price){ this.name = name; this.price = price; if(price < 0){ throw RangeError('Cannot create product ' + this.name + ' with a negative price'); } } // call方法 function Food(name,price){ Product.call(this,name,price); this.category = "food"; } // 等同于 function Food(name,price){ this.name = name; this.price = price; if(price < 0){ throw RangeError('Cannot create product ' + this.name + ' with a negative price'); } this.category = "food"; } // 以DOM为例子 /*function changeStyle(attr, value){ this.style[attr] = value; } var box = document.getElementById('box'); window.changeStyle.call(box, "height", "200px"); window.changeStyle.apply(box, ['height', '200px']);*/ /*// 实现继承 var Parent = function(){ this.name = "yc", this.age = "1" } var child = {}; Parent.call(child); // 实现继承*/ /*log("%c红色的字, %c绿色的字, %c大象", "color:red", "color:green", "line-height:100px;padding:50px;background:url(http://fanjs.net/res/img/favicon.ico");*/ function say(name){ console.log(this + "," + name); } say.call2 = function( thisObj, arg1 ) { thisObj = new Object( thisObj ); thisObj.say = this; return thisObj.say(arg1); }; say.call2("hola","Mike"); /* * object.prototype.call * @ 当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。 * @ 语法: fun.call(thisArg[, arg1[, arg2[, ...]]]) * @ param: thisArg {object} //当前引用对象 * @ 不传参数,传null,undefined, this指向window对象 * @ 传递另一个函数的函数名fun2, this指向函数fun2的引用 * @ 传递一个对象,函数中的this指向这个对象 * @ 值为原始值(数字,字符串,布尔值), this会指向该原始值的自动包装对象,如String,Number,Boolean * @ param: arg1, arg2, ... {object} // arguments参数 */ // call函数中的this指向 function a(){ console.log(this); } function b(){} var objthis = {name: "Alan"}; //定义对象 a.call(); // window a.call(null); // window a.call(undefined); // window a.call(1); // Number {[[PrimitiveValue]]: 1} a.call(""); // String {length: 0, [[PrimitiveValue]]: ""} a.call(true); // Boolean {[[PrimitiveValue]]: true} a.call(b); // function b(){} a.call(objthis); // Object {name: "Alan"} // 使用call对象的构造函数链 function Product(name, price){ this.name = name; this.price = price; if(price < 0){ throw RangeError("Cannot create product " + this.name + " with negative price"); } } function Food(name,price){ Product.call(this,name,price); this.category = "food" } var cheese = new Food("feta",5); // 使用call调用匿名函数 var animals = [ { species: "Lion", name: "king" }, { species: "Whale", name: "Fail" } ] for(var i = 0; i < animals.length; i++){ (function(i){ this.print = function(){ console.log("#" + i + " " + this.species + ": " + this.name); } this.print(); }).call(animals[i],i); // 等同于 /*(function(){ this.print = function(){ console.log("#" + i + " " + animals[i].species + ": " + animals[i].name); } this.print(); })();*/ } // 使用call调用函数的上下文this function greet(){ var reply = [this.person, "Is An Awesome", this.role].join(" "); console.log(reply); } var obj = { person: "Douglas Crockford", role: "Javascript Developer" }; greet.call(obj);