prototype __proto__ Function

我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。(注意:是函数才有prototype属性)

而__proto__属性每一个对象都有。

在js中如果A对象是由B函数构造的,那么A.__proto__ === B.prototype

所以:

(1).__proto__ === Number.prototype//true

http://blog.csdn.net/aitangyong/article/details/44837655

结论1:Object.prototype只是一个普通对象,它是js原型链的最顶端。

[javascript] view plaincopy

  1. (typeof Object.prototype) === object;//true
  2. Object.prototype.__proto__=== null;//true
  3. Object.prototype.prototype === undefied;//true

Object.prototype只是一个普通对象(普通对象没有prototype属性,所以值是undefined),Object.prototype是js原型链的最顶端,它的__proto__是null(有__proto__属性,但值是null,因为这是原型链的最顶端)。

结论2:在js中如果A对象是由B函数构造的,那么A.__proto__ === B.prototype。

[javascript] view plaincopy

  1. function Person()
  2. {
  3. }
  4. var obj = {};
  5. alert(obj.__proto__ === Object.prototype);//true
  6. alert(Person.__proto__ === Function.prototype);//true

javascript中对象是由Object创建的,函数是由Function创建的。

结论3:内置的Object是其实也是一个函数对象,它是由Function创建的。

[javascript] view plaincopy

  1. Object.__proto__ === Function.prototype;

结论4:js中每一个对象或函数都有__proto__属性,但是只有函数对象才有prototype属性。

[javascript] view plaincopy

  1. //函数对象
  2. function Person()
  3. {
  4. }
  5. // 普通对象
  6. var obj = {};
  7. obj.__proto__ === Object.prototype;//true
  8. obj.prototype === undefined;//true
  9. Person.__proto__ === Function.prototype;//true
  10. Person.prototype !== undefined;//true

我们知道javascript正是通过prototype实现继承的。如果objA、objB都是由cFunction创建的,那么根据结论2,objA.__proto__ === objB.__proto__ === cFunction.prototype,也就是说objA和objB对象都继承了cFunction的prototype。原型链是基于__proto__形成的,继承是通过prototype实现的。

结论5:Function.prototype是个特例,它是函数对象,但是没有prototype属性。其他所有函数都有prototype属性。

[javascript] view plaincopy

  1. (typeof Function.prototype) === function;//true
  2. Function.prototype.prototype === undefined;//true

结论6:内置的Function也是一个函数对象,它是通过自己来创建自己的。

[javascript] view plaincopy

  1. (typeof Function.__proto__) === function;//true
  2. Function.__proto__=== Function.prototype;//true

Function这个函数对象,由其自身通过Function函数构造的。

结论7:函数也是对象,因为Function.prototype__proto__指向Object.prototype。

[javascript] view plaincopy

  1. (typeof Function.prototype.__proto__) === "object";//true
  2. Function.prototype.__proto__=== Object.prototype;//true

最后提一下:原型链是基于__proto__形成的,继承是通过prototype实现的。

每个对象都有一个__proto__属性,原型链上的对象正是依靠这个__proto__属性连结在一起的!  对于原型链上的一个对象obj,那么访问obj.xxx属性(方法也是属性)的过程是: 如果自身有xxx属性,则访问它;如果没有,就通过__proto__属性找到其原型链的上一级原型对象,看它有没有xxx属性,如此递归查找,直至找到xxx属性或到了原型链顶端Object.prototype对象为止。

函数拥有prototype属性,该属性值是一个object类型。当函数A创建对象B的时候,B对象的__proto__会指向A.prototype,这就是javascript的继承。

时间: 2024-10-15 15:55:41

prototype __proto__ Function的相关文章

Function.__proto__ === Function.prototype 引发了我胡乱的哲学思考

前两天我又试图顺着__proto__和prototype寻找JavaScript宇宙的本源,最后还是不出意料的疯了. 我没疯,经过无数次的测试,我偶然发现了这样一个令人奇怪的现象: 在chrome控制台中, Function.__proto__ === Function.prototype返回的是true,这就引发了我的思考. 思考了两三天,又刷了一遍MDN相关部分,有了新的收获. Function,从小往大说,应该是:构造函数--函数--对象. 1.Function是一个构造函数,通过new调

prototype 和function关系等总结

js提供了一些内置类,如Array String Function等,只要有类就有原型. 1,function ,属性包括 arguments, caller,length,name ,prototype,__proto__, 2,prototype,属性又分为constructor: function () {},__proto__: Object, 3,__proto__从别的原型链继承过来可以直接用的,prototype是要加在自己原型链上的,供别人调用,或者直接实例化后,别人可以直接调用

prototype & __proto__

[普通对象 vs 函数对象] js中对象分为两类,普通对象.函数对象.当在终端打印时,普通对象与函数对象有极其明显的差异. 一个不含杂七杂八的函数对象如下,这是第一种表现形式.: 若往里面塞东西,则会显示成下面这样.这是第二种表现形式,特点是[]别扭地紧跟在{右侧.: 一个普通对象有如下两种形式: 普通对象无法通过()来调用,函数对象可以通过()来调用,这是重大区别. [内置数据剖析] js引擎内部有一个函数对象,这里称为BaseFunction,以及一个空对象,这里称为Root. BaseFu

js new都做了什么 prototype __proto__

现在对自己之前理解的东西,总结下,整理到这,看我那会画的一张图,我都不知道在说什么,那会的瞬间都疏通的感觉,现在基本都模糊了,我这脑子真是... 言归正传 开始: 一:思考new都做了什么,下面一个例子 function A (){ var a1=111; this.a2=222; function fa(){ console.log(a1); } fa(); } A.prototype.a3="333"; var b = new A(); new一个构造函数, 1:会先新建一个对象,

Object.prototype.__proto__ 、Object.prototype和 Object.prototype.constructor

Object.prototype.__proto__: 实体对象指向造它的构造函数的 prototype属性所指 的对象 ,实例的__proto__是引用构造函数的prototype属性所指对象, Object.prototype : js规定,构造函数有prototype 属性,指向一个对象,这个对象一般就是构造函数的公有成员. 所以 __proto__  和 prototype 可以指向同一个对象  {key1:value1,key2:value2,......},构造函数的私有和特权函数会

instanceof,Object.getPrototypeOf(),Object.create(),Object.setPrototypeOf(),Object.prototype.isPrototypeOf(),Object.prototype.__proto__

一.instanceof instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例 var v = new Vehicle(); v instanceof Vehicle // true instanceof对整个原型链上的对象都有效,因此同一个实例对象,可能会对多个构造函数都返回true var d = new Date(); d instanceof Date // true d instanceof Object // true 利用instanceof运算符,还可以

实践一些js中的prototype, __proto__, constructor

<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link rel="stylesheet" type="text/css" href="ExtJs/

js 原型链 prototype __proto__

1.说明 函数(Function)才有prototype属性,对象(除Object)拥有__proto__. 2.prototype与__proto__区别 示例: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-w

Js prototype constructor __proto__ Function Object 关系图

constructor 及 prototype皆为对象下属性,  该属性保存着所指对象在内存中地址  ( 指向内存中 一个具体对象 ) 1.首先牢记一个概念 在js中一切皆为对象 eg: Number 为一个对象(函数对象) 该对象有 constructor 属性 该属性保存了Function函数对象在内存中的物理地址, constructor属性指向Function函数对象 Number 为一个对象(函数对象) 该对象有 prototype   属性 该属性保存了Number 原型对象在内存中