JS原型与原型链

157 阅读2分钟

全局对象 window

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

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

window 的属性就是全局变量。

这些全局变量分为两种:

1. ECMAScript 规定的

  • global.parseInt
  • global.parseFloat
  • global.Number
  • global.String
  • global.Boolean
  • global.Object

2. 浏览器自己加的属性(私有属性)

  • window.alert(弹窗提示)
  • window.prompt(用户填写)
  • window.comfirm(用户确认)
  • window.console.log
  • window.console.dir
  • window.document
  • window.document.createElement
  • window.document.getElementById
  • history

所有 API 都可以在 MDN 里找到详细的资料。

全局函数

Number

var n2 = new Number(1) 创建一个 Number 对象;
var n1=1
n1不是对象,基本类型没有属性,没有toString等属性;
进行临时转换:
temp = new Number(n1)
temp.toString()
temp是n1的一个复杂类型的封装,
temp.toString的值当作n1.toString的值;
最后干掉temp;


问题:
var n = 1
n.xxx = 2
n.xxx ?
undefined
第二行:只要一句结束,临时对象就会被清除;


String

var s2 = new String('hello') ,创建一个 String 对象;
var s='hello'

Boolean

var b2 = new Boolean(true) 创建一个 Boolean 对象;
var b = true


问题:
var f = false
var f2 = new Boolean(false)
if(f){console.log(1)}
if(f2){console.log(2)}
?
2
f2是一个对象,所有对象都是真值。


Object

var o1 = {}
var o2 = new Object()
o1 和 o2 没区别;
o1 === o2
false
不相等。

公用属性

所有对象都有 toString 和 valueOf 属性,我们不需要给每个对象一个 toString 和 valueOf 。
JS 的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象);
然后让每一个对象的 proto 存储这个「公用属性组成的对象」的地址。

重要公式
注意大小写,number 和 Number 是不同的

var 对象 = new 函数()

对象.proto === 对象的构造函数.prototype

proto 与 prototype 的区别:

__proto__是对象的属性,
prototype是函数的属性;
推论:

  • var number = new Number()
    number.proto = Number.prototype

  • var object = new Object()
    object.proto = Object.prototype

  • var function = new Function()
    function.proto = Function.prototype

所有函数都是由 Function 构造出来的,所以:

Number.proto = Function.prototype
// 因为 Number 是函数,是 Function 的实例;

Object.proto = Function.prototype
// 因为 Object 是函数,是 Function 的实例;

Function.proto == Function.prototye
// 因为 Function 是函数,是 Function 的实例。