关于Js原型链和构造函数的一道题。

首先说说我最近遇到的神奇代码:

Function.prototype.a="a";

Object.prototype.b="b";

function Person(){}

var p=new Person();

console.log("Person.a:"+Person.a+" Person.b:"+Person.b);//Person.a:a Person.b:b

console.log("p.a:"+p.a+" p.b:"+p.b);//p.a:undefined p.b:b


这里涉及到原型链和构造函数,我们先从构造函数开始吧。

构造函数是怎么构建一个实例对象的呢?这里我放上大神的代码,构造函数的四个步骤

var obj  ={};//创建一个对象

obj.__proto__ = CO.prototype;//obj对象的隐式原型指向构造函数的原型(为什么说隐式原型呢,因为只有函数才有prototype属性)

CO.call(obj);//将构造函数作用域赋值给obj对象

return obj;//obj对象返回

解释上面部分代码(var p=new Person()):就是创建了一个具有Person作用域的对象p,此时p的隐式原型指向Person原型。


往下面走,先分析为什么Person.a=”a”Person.b=”b”,首先function Person()其实就是创建了一个Function实例,所以Person.a=”a”,Person.prototype是一个原型对象,是一个Object实例,所以Person.b=”b”;

而为什么p.a=undefinedp.b=”b”呢?如果上面构造函数的四个步骤可以懂,其实就很好理解了,首先,p是一个对象,是Object的一个实例,所以它拥有b属性,但是它并不是Function实例,所以不具备a属性。

如果有哪里解释不对的,望您指正。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值