资讯专栏INFORMATION COLUMN

__proto__和prototype

raise_yang / 3285人阅读

摘要:属性对性能影响非常严重,不建议使用。当你创建函数时,会为这个函数自动添加属性。构造函数原型的默认指向自身。所有对象均从继承属性。结果见下图普通对象是构造函数的实例,所以普通对象的原型是。总结和其它函数由产生,的是他自己。

_proto_

每个对象都有一个__proto__(前后各两个下划线)属性来标识自己所继承的原型对象。__proto__属性对性能影响非常严重,不建议使用。

prototype

只有函数才有prototype属性。当你创建函数时,JS会为这个函数自动添加prototype属性。构造函数原型的constructor默认指向自身。

function Person(){
   this.name="aaa";
}
Person===Person.prototype.constructor // true
console.log(Person.prototype);// 结果见下图

Object和Function

每个内置对象都是一个native object。一个内置的对象同时也是一个构造函数。function是一种对象类型。

Function

function是内置Function的实例,即普通函数是Function的实例。因此普通函数的constructor是Function。Function的constructor还是他自己。

function Person(){var a=1;}
Person.constructor    //function Function() { [native code] }

Function     //function Function() { [native code] }
Function.constructor   //function Function() { [native code] }
Function===Function.constructor  //true

函数都有prototype属性和__proto__ 属性。函数的__proto__ 属性均是function () { [native code] }。可以这样理解,function既是对象,又是函数。function作为对象,有__proto__ 属性,因为__proto__ 属性指向构造函数的原型,而function是由Function创建的,因此普通函数.__proto__ =Function.prototype。

 function Person(){var a=1;}
 Person.__proto__===Function.prototype   ///true
 Function.prototype //function () { [native code] }

Function.prototype和Function.__proto__为同一对象。这是由于构造Function的是他自己,根据普通函数.__proto__ =Function.prototype,所以Function.__proto__ =Function.prototype

Function.prototype  //function () { [native code] }
Function.__proto__   // function () { [native code] }
Function.prototype===Function.__proto__   //true

Function.prototype的__proto__是Object.prototype。可以这样理解:Function.prototype也是一个原型对象,而普通对象的原型是Object.prototype,所以

Function.prototype.__proto__===Object.prototype //true

注意:使用 Function.prototype.bind创造的函数,没有prototype属性。

Object

Object.__proto__是Function.prototype。因为Object本身是个(构造)函数,是Function的实例。

Object.__proto__      //function () { [native code] }
Object.constructor    //function Function() { [native code] }

原型链的尽头(root)是Object.prototype。所有对象均从Object.prototype继承属性。

Object.prototype.__proto__   // null

某个对象.__proto__ =构造函数.prototype 。

var a={};
a.__proto__===Object.prototype //true
a.__proto__ //结果见下图

普通对象是Object构造函数的实例,所以普通对象的原型是Object.prototype。

 function Person(){this.name="aa";}
 var b=new Person();
 b.__proto__===Person.prototype; //true
 b.__proto__ //结果见下图

上图中b对象是Person构造函数的实例,所以b对象的原型是Person.prototype。

总结

1. Object和其它函数由Function产生,Function的constructor是他自己。

2. 一个对象必定有__proto__,而原型链的顶端是Object.prototype。

3. Object.prototype 是对象,但是不是通过Object函数创建的。因为Object.prototype.__proto__为null。

4. Object的__proto__是Function.prototype,但是Function.prototype也是一个原型对象,因此Function.prototype.__proto__为Object.prototype。

参考自:
从__proto__和prototype来深入理解JS对象和原型链
Function

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82909.html

相关文章

  • 傻傻分不清的__proto__prototype

    摘要:今天同事小英童鞋问了我一个问题小英童鞋认为的原型对象是,所以会继承的属性,调用相当于调用,但结果不是一个方法。构造函数创建对象实例函数有两个不同的内部方法和。如果不通过关键字调用函数,则执行函数,从而直接执行代码中的函数体。 今天同事小英童鞋问了我一个问题: function Foo(firstName, lastName){ this.firstName = firstNam...

    YancyYe 评论0 收藏0
  • js内功修炼之九阳神功--原型链

    摘要:写在前面如果说是一本武学典籍,那么原型链就是九阳神功。那么,如何修炼好中的九阳神功呢真正的功法大成的技术是从底层上去理解,那种工程师和码农的区别就在于对底层的理解,当你写完一行代码,或者你遇见一个解决的速度取决于你对底层的理解。 写在前面 如果说JavaScript是一本武学典籍,那么原型链就是九阳神功。在金庸的武侠小说里面,对九阳神功是这样描述的:练成「九阳神功」后,会易筋洗髓;生出...

    苏丹 评论0 收藏0
  • js内功修炼之九阳神功--原型链

    摘要:写在前面如果说是一本武学典籍,那么原型链就是九阳神功。那么,如何修炼好中的九阳神功呢真正的功法大成的技术是从底层上去理解,那种工程师和码农的区别就在于对底层的理解,当你写完一行代码,或者你遇见一个解决的速度取决于你对底层的理解。 写在前面 如果说JavaScript是一本武学典籍,那么原型链就是九阳神功。在金庸的武侠小说里面,对九阳神功是这样描述的:练成「九阳神功」后,会易筋洗髓;生出...

    Profeel 评论0 收藏0
  • js内功修炼之九阳神功--原型链

    摘要:写在前面如果说是一本武学典籍,那么原型链就是九阳神功。那么,如何修炼好中的九阳神功呢真正的功法大成的技术是从底层上去理解,那种工程师和码农的区别就在于对底层的理解,当你写完一行代码,或者你遇见一个解决的速度取决于你对底层的理解。 写在前面 如果说JavaScript是一本武学典籍,那么原型链就是九阳神功。在金庸的武侠小说里面,对九阳神功是这样描述的:练成「九阳神功」后,会易筋洗髓;生出...

    morgan 评论0 收藏0

发表评论

0条评论

raise_yang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<