JS里的对象
全局对象
global
(浏览器 window
)
window
的属性
-
ECMA Script 规定
- parseInt
- parseFloat
- Number()
- String()
- Boolean()
- Object()
- ...
-
浏览器私有(Chrome / FireFox)
- alert
- prompt
- confirm
- console
- document
- history
- ...
两种变量声明的方式
- 为了像 java,js 诞生之初有两种声明数据类型的方式。
- 第一种
var n1 = 1 console.log(n1) // 1
- 第二种
var n2 = new Number(1) console.log(n2) // Number {1}
缺点:基本类型没有属性。
解决方案:调用属性时生成一个临时对象,然后调用该对象的属性。
注意:一旦属性调用完成,临时对象即被销毁。var n = 1 n.toString() // var temp = new Number(n) // temp.toString() // 结果返回给 n.toString() "1"
var n = 1 n.xxx = 2 // 随即临时对象销毁 n.xxx // 重新生成临时对象,没有xxx属性,返回undefined
- 第一种
原型
所有对象都可以调用 toString() 和 valueOf() ,而它们自身却不一定包含这两个属性。这是原型和原型链的功劳。
为了理解原型、原型链和继承,我详细阅读并翻译了一篇英文博客:《JavaScript 核心》(1):对象、原型和继承。在这里,我用自己的理解简单总结一下:
prototype chain.png原型链是一种类似属性继承的机制。
- 所有对象都有
__proto__
属性,它指向该对象的原型。通过__proto__
属性,实例对象可以借助原型链来调用它的原型以及它的原型的原型所拥有的属性。 - 原型也是对象,它的
__proto__
指向Object.prototype
而Object.prototype
的__proto__
指向null
,也就是原型链的最后一环。 - 所有的原型对象也就是
Xxx.prototype
都有一个constructor
属性,指向该原型的构造函数。该构造函数new
出来的实例对象可以调用原型对象的constructor
来访问到构造函数。 - 函数也是对象,它们的
__proto__
指向了Function.prototype
,包括Function
函数本身。
网友评论