prototype和__proto__的关系

prototype是函数独有的属性。当我们使用关键词new并且将函数作为构造函数来构造对象的时候,它被用来构建对象的__proto__属性。

当你创建函数时,JS会为这个函数自动添加prototype属性,值是一个有 constructor 属性的对象。而一旦你把这个函数当作构造函数(constructor)调用(即通过new关键字调用),那么JS就会帮你创建该构造函数的实例,实例继承构造函数prototype的所有属性和方法(实例通过设置自己的__proto__指向承构造函数的prototype来实现这种继承)。

JS正是通过__proto__和prototype的合作实现了原型链,以及对象的继承。

 

 

不管咋说都不好理解 ,简单写个例子吧:

function fn(name) {
	this.name = name;
}

fn.prototype.show = function() {
    alert(this.name);
}

var obj = new fn('my name is obj'); // 通过new字符,obj的__proto__默认指向fn.prototype
obj.show() // 输出my name is obj

aa.__proto__ = Array; // 直接修改aa.__proto__到Array,aa便有了数组的静态方法
aa.isArray( [] ) // true
aa.show // 此时是undefined 因为原型链指向已经被修改了

最后说一下constructor构造函数,__proto__的constructor其实很好理解,最简单的理解就是调用的谁就是谁,上面 var obj = new fn('my name is obj') 中调用的是fn函数,所以 obj.__proto__.constructor === fn 输出 true,fn的构造函数来自内置Function对象,fn.__proto__.constructor === Function 也是输出true。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值