标题没错,就是原型和原型链,我自己是懂了,等我能用大家都能懂的写出来的时候再来编辑
1 全局对象
ECMAScript 规定全局对象叫做 global,但是浏览器把 window 作为全局对象(浏览器先存在的)
window 就是一个哈希表,有很多属性。
window 的属性就是全局变量。
这些全局变量分为两种:
- 一种是 ECMAScript 规定的
- global.parseInt
- global.parseFloat
- global.Number
- global.String
- global.Boolean
- global.Object
- 一种是浏览器自己加的属性
- window.alert(弹出框)
- window.prompt(用户输入)
- window.comfirm (确认)
- window.console.log(开发者打印)
- window.console.dir
- window.document(文档)
- window.document.createElement
- window.document.getElementById
所有 API 都可以在 MDN 里找到详细的资料。
globol
2 全局函数
基本包装类型
为了方便操作简单数据类型,JavaScript还提供了三个特殊的简单类型类型:String/Number/Boolean
Number
var n = new Number(1) 创建一个 Number 对象
1 与 new Number(1) 的区别是什么?看内存图-
String
var s = new String('hello') 创建一个 String 对象
'hello' 与 new String('hello') 的区别是什么?看内存图s.charAt(0) === s[0]
字符串对象的常用方法
字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串
// 1 字符方法 charAt() //获取指定位置处字符 charCodeAt() //获取指定位置处字符的ASCII码 str[0] //HTML5,IE8+支持 和charAt()等效 // 2 字符串操作方法 concat() //拼接字符串,等效于+,+更常用 slice() //从start位置开始,截取到end位置,end取不到 substring() //从start位置开始,截取到end位置, end取不到 substr() //从start位置开始,截取length个字符 // 3 位置方法 indexOf() //返回指定内容在元字符串中的位置 lastIndexOf() //从后往前找,只找第一个匹配的 // 4 去除空白 trim() //只能去除字符串前后的空白 // 5 大小写转换方法 to(Locale)UpperCase() //转换大写 to(Locale)LowerCase() //转换小写 // 6 其它 search() replace() split()
Boolean
var b = new Boolean(true) 创建一个 Boolean 对象
true 与 new Boolean(true) 的区别是什么?看内存图Object
var o1 = {}
var o2 = new Object()
o1 和 o2 没区别
3 公用的属性藏在哪里
所有对象都有 toString 和 valueOf 属性,那么我们是否有必要给每个对象一个 toString 和 valueOf 呢?
明显不需要。
JS 的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象)
然后让每一个对象的
__proto__
存储这个「公用属性组成的对象」的地址。
Object.prototype (Object的共有属性) 原型
var o1 = {}
o1.__proto__ === Object.prototype
// true
Number.prototype(Number的共有属性)
var n1 = new Number(1)
n1.__proto__ === Number.prototype // true
n1.__proto__.__proto__ === Object.prototype // true
String.prototype(String的共有属性)
var s1 = new String('1')
s1.__proto__ === String.prototype // true
s1.__proto__.__proto__ === Object.prototype // true
Boolean.prototype(Boolean的共有属性)
var b1 = new Boolean(true)
b1.__proto__ === Boolean.prototype // true
b1.__proto__.__proto__ === Object.prototype // true
prototype 和 _proto_的区别
String.prototype是String的公用属性的引用 这个是防止String的公用属性变成垃圾的
_proto_是String的公用属性的引用 这个是对String的公用属性的使用
重要公式
var 对象 = new 函数()
对象.__proto__ === 对象的构造函数.prototype
// 推论
var number = new Number()
number.__proto__ === Number.prototype
Number.__proto__ === Function.prototype // 因为 Number 是 Function 的实例
var object = new Object()
object.__proto__ === Object.prototype
Object.__proto__ === Function.prototype // 因为 Object 是 Function 的实例
var function = new Function()
function.__proto__ === Function.prototype
Function.__proto__ === Function.prototye // 因为 Function 是 Function 的实例!