美文网首页前端之路
关于js的一道题(大佬勿笑)

关于js的一道题(大佬勿笑)

作者: 咩也都唔识 | 来源:发表于2018-05-04 10:52 被阅读0次

    首先说说我最近遇到的神奇代码:

    Function.prototype.a="a";

    Object.prototype.b="b";

    function Person(){}

    var p=new Person();

    console.log("Person.a:"+Person.a+" Person.b:"+Person.b);//Person.a:a Person.b:b

    console.log("p.a:"+p.a+" p.b:"+p.b);//p.a:undefined p.b:b

    让我们先从构造函数开始吧!

    构造函数是怎么构建一个实例对象的呢?这里我放上大神的代码,

    构造函数的四个步骤:

    var obj  ={};//创建一个对象

    obj.__proto__ = CO.prototype;//obj对象的隐式原型指向构造函数的原型(为什么说隐式原型呢,因为只有函数才有prototype属性)

    CO.call(obj);//将构造函数作用域赋值给obj对象

    return obj;//将obj对象返回

    解释上面部分代码(var p=new Person()):就是创建了一个具有Person作用域的对象p,此时p的隐式原型指向Person原型。

    往下面走,先分析为什么Person.a=”a”和Person.b=”b”,首先function Person()其实就是创建了一个Function实例,所以Person.a=”a”,而Person.prototype是一个原型对象,是一个Object实例,所以Person.b=”b”;

    而为什么p.a=undefined而p.b=”b”呢?如果上面构造函数的四个步骤可以懂,其实就很好理解了,首先,p是一个对象,是Object的一个实例,所以它拥有b属性,但是它并不是Function实例,所以不具备a属性。

    如果有哪里解释不对的,望您指正。

    相关文章

      网友评论

        本文标题:关于js的一道题(大佬勿笑)

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