JS给函数添加属性

在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)
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值