浅解 JS 原型链

Nodejs cyanprobe 8年前 (2016-06-06) 3845次浏览 已收录 1个评论

前言:

抄啊,抄啊我的骄傲放纵,抄啊抄啊抄不完我一万字检讨。表示抄检讨的时候抄到对象集成有个jack.__proto__=people.prototype。然后people包含一个name属性,后面原型继承下来打印不了,问Shadow Walker 那个渣比,渣比说太简单了自己都不知道如何跟我讲….果断百度后转战柴犬,柴犬君告诉我,神马构造器他不懂(PS:赤裸裸的敷衍),一怒之下,我便找了几篇文章抄了几遍。然后又被Geemo那个龟孙骗去2瓶营养快线,现在感觉自己萌萌哒。

正文:

 function bitch() {
 this.name="一个婊子"
 this.printbitch=function () {
 console.log("a bitch ");
 }
}
var usual=function () {
 this.age=1;
};
usual.__proto__=bitch.prototype;
var geemo=new usual();
console.log(geemo);//{age:1}
console.log(geemo.name);//undefined

为什么没有name这个属性,instanceof一下发现geemo还是属于婊子。菜逼至此,只好去翻书,最后翻懂了。
先从new说起,new一个新对象其实是经过三步。

//例如 var geemo=new usual();
var geemo={};
geemo.__proto__=usual.prototype;
usual.call(geemo);//用usual对象构造geemo对象

那么,上面缺少了哪一步?用父构造子。于是使用var usual=new bitch();或者————
var usual=function () {
bitch.call(this);
this.age=1;
};
就能集成父对象的属性了。
原型链,我们先从__proto__说起,这是每个对象内部产生的属性,当我们访问一个对象的属性,如果当前对象不存在该属性就会跑到__proto__中寻找,依次进行下去__proto__.__proto__….这就是原型链的实现。
geemo.__proto__=usual.prototype;  如果geemo不存在的属性就会到__proto__里寻找,然而__proto__指向usual.prototype如此,在指向中没有找到于是继续usual.__proto__中寻找。
好了掌握了这些东西,马上到群里装逼,感觉逼格+N….结果 尤里卡大肘子出了这么一道题:

var F = function(){};
Object.prototype.a = function(){console.log('aaa')};
Function.prototype.b = function(){console.log('bbb')};
var f = new F();
f.a()
f.b()

Shadow Walker那个渣比果断说aaa,bbb。我经过缜密的思考选择了狗带。那么让我们选择回炉重造。
我们可以结合以下结论来看
1.Object.prototype只是一个普通对象,它是js原型链的最顶端他的__proto__属性是null(但仍可以__proto__往下创建属性-》Function constructor)。

(typeofObject.prototype) === object;//true
Object.prototype.__proto__=== null;//true

2.在js中如果A对象是由B函数构造的,那么A.__proto__ === B.prototype。
3.内置的Object是其实也是一个函数对象,它是由Function创建的

Object.__proto__ === Function.prototype;

4.:js中每一个对象或函数都有__proto__属性,但是只有函数对象才有prototype属性。
5.Function.prototype是个特例,它是函数对象,但是没有prototype属性。其他所有函数都有prototype属性。
6.函数也是对象,因为Function.__proto__指向Object.prototype。


好了,那我们来看看之前那个程序,首先对象f-》f.__proto__-继续寻找-》Function.prototype-继续寻找-Function.prototype.__proto__等同于-》Object.prototype(找到A-继续寻找Object.prototype.__proto__==null-》未找到fun b报错。
ccdab1ea-87b4-38f4-b40b-333c46cd5f8a
在创建对象的时候可以在Object下由Object.constructor也就是Function.__proto__创建,因为一个对象包含多个属性,其中有__proto__也有类似name之类的,找到需要的属性就停止,所以在原型链中不会存在Object由Function.__prototype,Function由Object.__proto__循环创建的问题。geemo
让我们铭记这个羞辱的时刻。
 
 


CyanProbe , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:浅解 JS 原型链
喜欢 (2)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 首先对象f-》f.__proto__也就是F.prototype-》继续寻找-F.prototype.__proto__等同于-》Object.prototype(找到A-继续寻找Object.prototype.__proto__==null-》未找到fun b报错。。你写错了,群主
    2016-09-09 23:30 回复