原型与原型链

全局对象 window

ECMAScript 规定全局对象叫做 global,但是浏览器把 window 作为全局对象(浏览器先存在的)

window 就是一个哈希表,有很多属性。

window 的属性就是全局变量。

这些全局变量分为两种:

一种是 ECMAScript 规定的

1
2
3
4
5
6
global.parseInt
global.parseFloat
global.Number
global.String
global.Boolean
global.Object

一种是浏览器自己加的属性

1
2
3
4
5
6
7
8
window.alert
window.prompt
window.comfirm
window.
window.console.dir
window.document
window.document.createElement
window.docu

n=1与n = new Number(1)区别

1
n=1

是一个基本类型

1
n = new Number(1)

创建一个Number对象

所以为什么一个基本类型可以使用  .  属性呢?

1
2
var n = 1 
n.toString() //这时会创造一个临时的对象tamp里面有各种属性,这句执行完后,tamp消失

1
2
3
var n = 1
n.xxx = 2 //不会报错,这句执行完后,tamp消失
n.xxx //undefined 读取不到

tamp.png

1
2
3
o1 = {}
o2 = new object {}//没有区别,但不完全相等
o1 === o2 // false 地址不一样

__proto__ 与 prototype

  • 每个对象都具有一个名为__proto__的属性;

  • 每个构造函数(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的方法(注意:既然是方法,那么就是一个对象(JS中函数同样是对象),所以prototype同样带有__proto__属性);

  • 每个对象的__proto__属性指向自身构造函数的prototype;

  • Function的__proto__指向其构造函数Function的prototype;

  • Object作为一个构造函数(是一个函数对象!!函数对象!!),所以他的__proto__指向Function.prototype;

  • Function.prototype的__proto__指向其构造函数Object的prototype;

  • Object.prototype的__proto__指向null(尽头)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function Fun(){
}
//创造了一个函数Fn
//这个函数由Function生成(Function作为构造函数)
var fn=new Fun()
//创建了一个函数fn
//这个函数由Fn生成(Fn作为构造函数)


fn.__proto__===Fun.prototype //true
//fn的__proto__指向其构造函数Fun的prototype
Fun.__proto__===Function.prototype //true
//Fun的__proto__指向其构造函数Function的prototype
Function.__proto__===Function.prototype //true
//Function的__proto__指向其构造函数Function的prototype
//构造函数自身是一个函数,他是被自身构造的
Function.prototype.__proto__===Object.prototype //true
//Function.prototype的__proto__指向其构造函数Object的prototype
//Function.prototype是一个对象,同样是一个方法,方法是函数,所以它必须有自己的构造函数也就是Object
Fun.prototype.__proto__===Object.prototype //true
//与上条相同
//此处可以知道一点,所有构造函数的的prototype方法的__proto__都指向Object.prototype(除了Object.prototype自身)


Object.__proto__===Function.prototype //true
//Object作为一个构造函数(是一个函数对象!!函数对象!!),所以他的__proto__指向Function.prototype
Object.prototype.__proto__===null //true
//Object.prototype作为一切的源头,他的__proto__是null


//下面是一个新的,额外的例子
var obj={}
//创建了一个obj
obj.__proto__===Object.prototype //true
//obj作为一个直接以字面量创建的对象,所以obj__proto__直接指向了Object.prototype,而不需要经过Function了!

__proto__ 与 prototype.png