在JS中我们经常听到一句话就是:万物皆对象,一个变量是一个对象,一个函数是一个对象等等…而在这里面,函数与对象的关系又很微妙,请先思考一句话:对象都是由函数创建的,这句话是对的还是错的?
首先我们先看一个小例子:
function Fn() {
this.name = '王福朋';
this.year = 1988;
}
var fn1 = new Fn();
上面这个例子很简单,它说明对象可以通过函数来创建,但是不是所有对象都是由函数创建的呢?可能有人会说不对!我们平时声明对象不还有其他方式嘛,比如:
var obj = { a: 10, b: 20 };
var arr = [5, 'x', true];
但是不好意思,这个真的只是一种“快捷方式”,在编程语言中,一般称之为“语法糖”。
话归正传——其实以上代码的本质是:
//var obj = { a: 10, b: 20 };
//var arr = [5, 'x', true];
var obj = new Object();
obj.a = 10;
obj.b = 20;
var arr = new Array();
arr[0] = 5;
arr[1] = 'x';
arr[2] = true;
而其中的 Object 和 Array 都是函数:
console.log(typeof (Object)); // function
console.log(typeof (Array)); // function
所以,对象都是通过函数来创建的这句话是正确的!不过还有一个值得注意的点是:
假如给函数添加的属性也是一个函数,那么这个属性函数的this指向的是原函数,而不是window
var a = function(){
console.log("这是a函数");
}
a.fn = function(){
this();
}
a.fn() // 这是a函数
再看一个例子帮助大家加深一下理解:下面代码的this会输出什么?
var a = {
b: function() {
var fun = function() {
console.log(this);
};
fun();
},
};
a.b();
答:b里面的fun函数是无主的(没有使用xxx.fun进行调用,也没有call,apply等),无主的函数调用,里面的this在严格模式下为undefined,非严格模式下指向window
哦对了,除此之外还可以给数组加上属性,毕竟数组也是引用数据类型之一,请思考下以下代码输出的会是什么:
var a = []
a[0] = 1
a[1] = 2
a.foo = 'foo'
console.log(a.length)