prototype

作者: 强仔_5787 | 来源:发表于2017-09-01 12:21 被阅读0次
image
  1. 任何function拥有prototype 任何object拥有_proto_.

Ps: 由于prototype也是对象,所以prototype也拥有_proto_

  1. 原型对象在new的时候回复制给对象, object._proto_ = function.prototype

e.g function test(){}和var test = new Function()是等价的

test是Function的一个对象

Function中拥有prototype: bind(), call(), apply()等.

所以test._proto_ = Function.prototype, test可以访问bind, call, apply等

如果new 一个test的对象a, a = new test();

a._proto = test.prototype

此外所有function的原型对象中默认构造方法 constructor,

所以 test.prototype.constructor = test

  1. Object可以访问proto中的所有属性和方法, so上面的例子中

test._proto_.call = test.call;

  1. JS的世界中先有Object.prototype, 他不通过任何构造出来,所以他没有_proto_.

Function.prototype 包含call, bind,apply等。

任何prototype都实现了Object,所有Function.prototype._proto_ = Object.prototype

Function和Object都是通过Function构造, 所以Function和Object的_proto_都是Function.prototype

questions:
···

  1.  person1.__proto__ 是什么?
    
  2.  Person.__proto__ 是什么?
    
  3.  Person.prototype.__proto__ 是什么?
    
  4.  Object.__proto__ 是什么?
    
  5.  Object.prototype__proto__ 是什么?
    

答案:

第一题:

因为 person1._proto_ === person1 的构造函数.prototype

因为 person1的构造函数 === Person

所以 person1._proto_ === Person.prototype

第二题:

因为 Person._proto_ === Person的构造函数.prototype

因为 Person的构造函数 === Function

所以 Person._proto_ === Function.prototype

第三题:

Person.prototype 是一个普通对象,我们无需关注它有哪些属性,只要记住它是一个普通对象。

因为一个普通对象的构造函数 === Object

所以 Person.prototype._proto_ === Object.prototype

第四题,参照第二题,因为 Person 和 Object 一样都是构造函数

第五题:

Object.prototype 对象也有_proto_属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。

Object.prototype._proto_ === null

相关文章

网友评论

      本文标题:prototype

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