prototype的重新认识

注册帐号到动手写第一篇东西间隔了很长的时间,但是最近对于prototype的重新解读让我确实感到有一些东西是需要记录下来的,凭借一时的理解很可能在相当一段时间后变得不那么清晰,尤其是那些非常重要的概念,好吧,言归正传。

首先他是一个对象,当你创建一个function对象时,在点prototype时可以发现他。在控制台进一步查看的话prototype还可以点出constructor这个对象(这篇就不扩展了)。

然后当我们去new这个创建的function时,prototype这个对象就开始发挥他的魔力了。我们知道new出实例可以在上面为他点出任意的方法和属性,同时也可以用点来查找方法和属性。当然new出的实例的属性查找是按照链式方式逐级向先祖的对象延伸的。如果实例本身就具有这个属性那么查找到此结束,然后返回这个属性名称的值。如果实例本身不存在这个属性个,那么会从new出这个实例的function的prototype中去寻找,如果有这个属性名称的值,那就返回,查找结束。按照这样的链式顺序直到Object这个最原始的对象为止。下面来两段代码说明下这个问题:

var foo=function(){};
foo.prototype.p={a:"a",b:"b"};
var i1=new foo();
i1.p.a="c";
var i2=new foo();
console.log(i2.p.a);

控制台上输出 c

var foo=function(){};
foo.prototype.p={a:"a",b:"b"};
var i1=new foo();
i1.p={a:"a",b:"b"};
i1.p.a="c";
var i2=new foo();
console.log(i2.p.a);

控制台上输出 a

其实这个例子就说明了prototype链式查找(其中还给查找到的赋了值)的最终目标。第一个情况下i1是没有p这个属性,所以会进一步去foo的prototype中查找,正好也能找到,因此就返回foo的prototype中的p,然后更改一下p中a的值(这里直接改了原型)。第二个情况就是为i2先设置了p的值,然后同样赋值的时候,就直接更改i2这个对象的p中的a的值(没有改变原型)。
小小的结论:
new的对象的属性查找是从自己开始沿着父级的prototype寻找的。
赋值的时候尤其注意,这个行为是发生在自己本身身上的还是牵涉到原型(别的对象还要用那)。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值