原型链

 

JavaScript原型链讲解

1.每个对象都具有一个名为__proto__的属性;

2.每个构造函数(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的方法(注意:既然是方法,那么就是一个对象(JS中函数同样是对象),所以prototype同样带有__proto__属性);

3.每个对象的__proto__属性指向自身构造函数的prototype;

基础讲解:

    function Fn() {}// Fn为构造函数

    var f1 = new Fn();//f1是Fn构造函数创建出来的对象

    构造函数的prototype属性值就是对象原型。(Fn.prototype就是对象的原型)

    构造函数的prototype属性值的类型就是对象  typeof Fn.prototype===object. 

    对象原型中的constructor属性指向构造函数 (Fn.prototype.constructor===Fn)

    对象的__proto__属性值就是对象的原型。(f1.__proto__就是对象原型)

    Fn.prototype===f1.__proto__ 其实它们两个就是同一个对象---对象的原型。

    所有Fn.prototype.__proto__===Object.prototype

    typeof Object.prototype ===object。

    Object.prototype.__proto__===null。

 

 下面按图讲解:

1.标识1

实例对象f1是通过构造函数Foo()的new操作创建的。构造函数Foo()的原型对象是Foo.prototype;实例对象f1通过__proto__属性也指向原型对象Foo.prototype
复制代码
function Foo(){}; var f1 =new  Foo; console.log(f1.__proto === Foo.prototype);\\true
复制代码

 

 实例对象f1本身并没有constructor属性,但它可以继承原型对象Foo.prototype的constructor属性

复制代码
function Foo(){}; var f1 =new  Foo; console.log(Foo.prototype.constructor === Foo);//trueconsole.log(f1.constructor === Foo);/trueconsole.log(f1.hasOwnProperty('constructor'));false
复制代码

 

 

2.标识2

函数也是对象,只不过是具有特殊功能的对象而已。任何函数都可以看做是通过Function()构造函数的new操作实例化的结果

复制代码
var obj1=new Function(); console.log(obj1.constructor); console.log(Function); //两个的结果是一样的
复制代码

 

如果把函数Foo当成实例对象的话,其原型对象(标识4,5)是Function.prototype;原型对象Function.prototype的constructor属性指向构造函数Function();函数Object的构造函数也是Function(),实例对象Object和Foo本身没有constructor属性,需要继承原型对象Function.prototype的constructor属性。

复制代码
function Foo(){}; var f1 
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信