面向对象吧!
全局对象window
标准里名为 global
但浏览器实现为window,global具有的window都有
ECMAScript规定的
如:
- parseInt()
- parseFloat()
- ……
浏览器私有
每个浏览器不一样,
比如chrome/firefox具有
alert()
弹出提示框
还有prompt()
提示输入confirm()
提示确认console()
控制台打印setTimeout(function,3000)
指定毫秒后执行函数document
document也是私有的
dom规范由w3c指定
声明对象
var n = new number(1)
把1包装成对象,会有更多的一些方法
但是基本类型其实也可以使用各种方法,这是因为JS会在发现把其当作对象时,自动以它的值创建对象,调用结束就把它删除,这就像java的自动装箱/拆箱,所有的基本类型都是如此,包括string
语法糖
1 | a = {} |
这两者功用是一样的
String对象
- .toString(a) a指定以几进制显示
- .charAt()返回指定索引的字符
- .charCodeAt(0) 返回指定索引的unicode编码
- .trim 去掉多余的空格
- .concat(s) 将当前字符串与参数里面的字符串连接起来并返回(那和
+
有什么区别?) - .slice(1,2) 返回指定索引到指定索引的字符(0,1]
Boolean对象
注意:new Boolean() 也是true
原型链(继承?)
为了解决什么问题?
某一类对象拥有共同的方法,或属性,每个对象都声明一次既费时间又浪费内存,这时候使用继承就OK啦!
怎么解决的
拥有共通属性的对象,把共通的属性抽象出来作为一个父对象,子对象不再存储这些共通的属性和方法,而使用__proto__存储父对象。
当我像调用toString()
时,过程是怎样的?
过程:
- 判断是否是对象,如果是,自动装箱将其包装成对应的临时包装对象。
- 查找当前对象是否包含
toString()
方法。 - 如果当前对象不包括,访问
__proto__
里存储的父对象,继续寻找toString()
- 如果找到停止寻找,否则继续递归下去。
从这里就可以看出,如果子对象和父对象拥有同样的方法/或者属性,总是使用的子对象的值,我们可以把这个称作覆盖
Object是所有对象的父对象,Object再向上就为null
如何设置公有属性?
这里我们其实需要理解是如何创造对象的?
1 | var n = new Object() |
在这里 其实new Object()
实际在调用一个函数,我们可以称作这个函数为构造函数,函数返回一个根据参数生成的对象。
因此这里可以看做
1 | var n = function Constructor(){ |
实质上,在js中,函数也只是一种对象
Function对象
如果我们使用console.dir
打印Obeject、Number、Function的所有属性,我们就能真正理解__proto__和prototype具体是个什么鬼
- Function
1
2
3...
prototype : f()
__proto__ : f()- 展开
prototype
1
2...
prototype : Object
- 展开
- Object
1
2prototype : 一堆我看不懂的东西
__proto__ : f() - Number
1
2prototype : 一堆我看不懂的东西
__proto__ : f()
我们发现了什么?
我们知道使用new 关键字创建的对象会得到原型对象的prototype
的地址并保存在__proto__
中,这样就能共用方法及属性。
但是,原型对象又怎么产生?
这里就解释了一切,Function是所有原型对象的爸爸,所有的原型对象都是Function构造的,而Function爸爸需要让所有原型对象最后都继承自Object,这样才能面向对象嘛,所以prototype
中的__proto__ : Object
表示继承自Object,这种处理方式可能就叫中间层?
至于__proto__
指向自己,我猜测可能是在某些情况需要new Function
来创造一个Function子对象,这样就能让Function表里如一。
以上很多都是自己的猜测,可能有许多谬误,以后加深理解了再来更新,不说了,图还没画完呢…赶作业去了