如下:

<script>
/*
function fn(){

}
console.log(typeof Function.prototype);
// console.dir(fn);//"function" 基类Function对应的prototype是一个函数数据类型,他的名字叫做Empty

//Function的prototype上定义的toString:让当前执行的主体(函数)转换成字符串
console.log(fn.toString());//this-->fn
console.log(fn.__proto__.toString());//Function.prototype.toString() this-->Function.prototype
//Object.prototype上定义的toString:
console.log(fn.__proto__.__proto__.toString());//[object Object]
//fn.__proto__=Function.prototype
*/

//var ary=[1,2,3];
//console.log(ary instanceof Array);//true
//console.log(ary.constructor==Array);//true
//console.log(Object.prototype.toString.call(ary));
/*console.log(Object.prototype.toString.call([]));
console.log(Object.prototype.toString.call(1));
console.log(Object.prototype.toString.call(""));
console.log(Object.prototype.toString.call(true));
console.log(Object.prototype.toString.call(null));
console.log(Object.prototype.toString.call(undefined));
console.log(Object.prototype.toString.call({}));
console.log(Object.prototype.toString.call(/^$/));
console.log(Object.prototype.toString.call(new Date()));*/


//每一个函数都是Function这个内置类的一个实例,而在Function.prototype上定义了两个常用的方法call、apply,所以每一个函数都可以中这两个方法了
//call、apply的作用:
//1、让函数执行
//2、把函数里面的this改变成我们想要的,想让this是谁,第一个参数就传谁
//在非严格模式下
//fn.apply();//this-->window
//fn.call(null);//this-->window
//fn.call(undefined);//this-->window
//在严格模式下 "use strict";
//fn.apply();//this-->undefined
//fn.call(null);//this-->null
//fn.call(undefined);//this-->undefined

//call和apply的唯一区别:
//在执行函数传递参数的时候,call是一个个传的,apply是把所有需要传递的参数放到数组中,一起传过去

//js中的this:
//1、给元素绑定事件,函数执行时候里面的this就是被绑定的这个元素
//2、自执行函数不管写在哪,也不管在哪执行,里面的this就是window
//3、函数执行,看函数之前有没有".",有的话"."之前是谁this就是谁,没有"."就是window
//4、构造函数模式中的this是当前的实例
//5、我们还可以使用call和apply强制改变函数中的this,第一个参数写谁,this就是谁(不写、null、undefined除外)
/*window.setTimeout(function(){
console.log(this);//this-->window
},1000);*/


/*var num = 2;
var obj = {num: 1};
function fn(a, b, c) {
console.log(this);
}
fn(1,2,3);
//fn.call(1,2,3);//执行函数fn 让this变成1,传递两个值2,3
fn.call(null,1,2,3);
fn.apply(null,[1,2,3]);*/


//fn();//this-->window 2
//obj.fn(); obj下没有fn这个属性,所以obj.fn=undefined undefined() Error:undefined is not a function
//fn.call(obj);//this-->obj
//fn.apply(obj);//this-->obj
//fn.call(12);//this-->12
//fn.apply("");//this-->""


</script>