深入理解javascript原型和闭包

    函数就是对象的一种,因为通过instanceof函数可以判断。函数就是对象的一种,因为通过instanceof函数可以判断。

var fn = function () { };
 console.log(fn instanceof Object);  // true

   对!函数是一种对象,但是函数却不像数组一样——你可以说数组是对象的一种,因为数组就像是对象的一个子集一样。但是函数与对象之间,却不仅仅是一种包含和被包含的关系,函数和对象之间的关系比较复杂,甚至有一点鸡生蛋蛋生鸡的逻辑,咱们这一节就缕一缕。

 function Fn() {             
     this.name = '王福朋';            
     this.year = 1988;         
}        
     var fn1 = new Fn();

上面的这个例子很简单,它能说明:对象可以通过函数来创建。对!也只能说明这一点。

但是我要说——对象都是通过函数创建的——有些人可能反驳:不对!因为:

var obj = { a: 10, b: 20 }; 
var arr = [5, 'x', true];
但是这只是创建对象的一种快捷方式,其内部依然会通过new Object() 去创建 

所以,可以很负责任的说——对象都是通过函数来创建的

现在是不是糊涂了—— 对象是函数创建的,而函数却又是一种对象——天哪!函数和对象到底是什么关系啊?

下面我们要去了解一下prototype原型对象

函数也是一种对象。他也是属性的集合,你也可以对函数进行自定义属性。

不用等咱们去试验,javascript自己就先做了表率,人家就默认的给函数一个属性——prototype。对,每个函数都有一个属性叫做prototype。---函数原型对象

这个prototype的属性指向一个对象,就是原型对象,默认有一个constructor 属性指向构造函数


function Fn() {}
    Fn.prototype.name = 'zhangsan';
    Fn.prototype.getName = function () {
      return name;
    }
    var f1 = new Fn()
    console.log(f1)


每个对象都有一个隐藏的属性——“__proto__”,这个属性引用了创建这个对象的函数的prototype。

这个__proto__是一个隐藏的属性,javascript不希望开发者用到这个属性值,有的低版本浏览器甚至不支持这个属性值。所以你在Visual Studio 2012这样很高级很智能的编辑器中,都不会有__proto__的智能提示,但是你不用管它,直接写出来就是了。

每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。

自定义函数的prototype本质上就是和var obj = {} 是一样的,都是被Object创建,所以它的__proto__指向的就是Object.prototype。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值