您的位置:首页 > Web前端 > JQuery

jquery一张图

2015-08-15 13:07 543 查看
拼装整理的



/**
this:
永远指向调用者上下文,总是涉及到上下文切换。

__proto__:
指向构造函数时的prototype。

prototype:
只有函数才有prototype 。其实prototype只是一个假象,他在实现原型链中只是起到了一个辅助作用,
换句话说,他只是在new的时候有着一定的价值,而原型链的本质,其实在于__proto__。
------------------------------------
var Person = function () { };
var p = new Person();

new的过程拆分成以下三步:
<1> var p={}; //也就是说,初始化一个对象p。
<2> p.__proto__=Person.prototype; //prototype只是在new的时候有着一定的价值,即_proto__指向构造函数时的prototype
<3> Person.call(p); //也就是说构造p,也可以称之为初始化p。
》call:将p作为Person()的上下文
------------------------------------

首先,并不是所有的对象都有prototype,只有函数才有prototype。实例没有prototype。
其次,所有的对象(函数也是对象,Function的实例)都有__proto__的内部属性,指向构造函数时的prototype。

查询属性(this.或funcName.prototype暴露)的步骤:
1.对象在调用一个方法时会首先在自身里寻找是否有该方法,
2.若没有,则通过内部的__proto__属性去自己的构造函数时的prototype上去寻找,
3.若此prototype上没有,则通过此prototype内部的__proto__属性去此prototype的构造函数时的prototype上去寻找
4.依次层层递进,直到**=>__proto__=>__proto__=null为止,这样往上追溯的整个过程,即原型链。

重指定函数funcName的prototype,原实例无法再继承(因为原实例_proto__指向构造函数时的prototype),但新实例继承。
》这样新实例会很乱,建议不要重指定函数的prototype。

例如:
function Person(){};
var fs1 = new Person();
//fs1.__proto__==Person.prototype都是{constructor:Person(),__proto__:Object}

fs1.constructor.prototype==fs1.__proto__
》true

fs1.constructor.prototype==Person.prototype
》true

//重指定构造函数的prototype
Person.prototype={};

fs1.constructor.prototype==Person.prototype
》true

fs1.constructor==Person
》true

//fs1.__proto__还是{constructor:Person(),__proto__:Object}
fs1.constructor.prototype==fs1.__proto__
》false

Person.prototype.v1=1;

//原实例无法再继承
fs1.v1
》undefined

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  js jquery