美文网首页
原型链、原型(延伸Function与Object的关系)

原型链、原型(延伸Function与Object的关系)

作者: 臭豆腐_9610 | 来源:发表于2018-06-29 14:29 被阅读0次

    typeof bar === "object"  有哪些弊端?

    typeof  {}  === "object";

    typeof []  === "object";

    typeof null === "object";

    可以使用 Object.prototype.toStirng.call(bar) == "[object Object]";

    延伸:   object.prototype  原型和原型链

    原型:

    在JavaScript中所有对象都是Object的实例,都继承Object的属性和方法。

    在对象创建中会存在一个原型对象prototype,在普通对象中没有  但有一个__proto__;

    也就是说在function中跟 new 创建的对象有一个本质的区别, function中有prototype , new生产的对象没有,有__proto__

    var fn = new Object();

    console.log(fn.prototype);   //undefined

    console.log(fn.__proto__);    //Object

    ============>

    var fn =  function(){};

    var fn1 = new fn();

    console.log(fn1.__proto__  === fn.prototype)  //ture;

    原型链

    那么__proto__是什么? 每个对象在其内容初始化一个属性 __proto__

    Object 的本质函数对象 就是 Function.prototype   : Object.__proto__ === Function.prototype

    Function也是函数对象    Function.__proto__  === Function prototype

    Object.prototype也有一个__proto__属性,但毕竟特殊 为  null  :  Object.prototype.__proto__  === null;

    当访问一个对象的属性时,当对象自身不存在就会通过 __proto__进行查找这个__proto__又会有自己的__proto__,

    直到找到位置,这就是原乡链;

    var fn = function(){};

    fn.prototype.name = function(){

        console.log("我是name")

    }

    var fn1 = new fn();

    fn1.name();

    解释  Function instanceof  Object   //true    Object instanceof  Function

    instanceof 就是检测 一个对象是不是另一个对象 new 出来的

    L instanceof B      ==>   L.__proto__.__proto__ ...... __proto__    === B.prototype

    (也就是左侧对象__proto__链上是否有 右侧对象的prototype);

    从图中可以看出

    Function.__proto__.__proto__  === Object.prototype

    Object.__proto__  === Function.prototype

    总之记住两点:

    1、所有构造器的constructor 都指向 Function

    2、Function.prototype 指向一个特殊的匿名函数,而这个特殊的匿名函数的__proto__指向 Object.prototype

    那么    function(){}  跟 new Object{}  是什么关系

    从上图可以得出  

    (function(){}).__proto__.__proto__  指向 Object.prototype

    new Object().__proto__  也指向 Object.prototype

    所以  (function(){}).__proto__.proto__  === new Object().__proto__

    也就是说    

    (function(){})  instanceof  Object  //true 

    new Object()  instanceof Object  //true

    相关文章

      网友评论

          本文标题:原型链、原型(延伸Function与Object的关系)

          本文链接:https://www.haomeiwen.com/subject/zeioyftx.html