js去掉前后空格的函数_StudyNote -- JS原型 & 原型链

5b68c278281efab38ae5382bf98b576e.png

全局对象

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

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

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

全局函数

  1. Number

var n = new Number(1) 创建一个 Number 对象

var n1 = 1 与var n2 = new Number(1) 的区别是什么?

9067eacd0651fbbb9de929de9e08293b.png
内存图解

*n2包装成对象后里面有一些内嵌函数可以调用,n1就只是一个单独的数字。但是n1也可以调用这些方法,原因是给n1创建了一个临时变量,当这一个语句执行完该临时变量就被销毁。

var n = 1
n.xxx = 2  //不会报错
console.log(n.xxx) //undefined,因为上一句创建的临时变量已经被销毁,现在是另一个新的临时变量

2. String
var s = new String('hello') 创建一个 String 对象
'hello' 与 new String('hello') 的区别是什么?同上

常用api:

  • str.trim() — 去掉空格
  • str.charAt(’s’) — 返回’s'字符在该字符串中的位置
  • str1.concat(str2) — 将两个字符串连接在一起
  • str.slice(index1,index2) — 根据index截取字符串(包含index1,不包含index2)
  • str.replace(’s’,'r’) — 将字符串中的’s’换成’r'

3. Boolean

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

true 与 new Boolean(true) 的区别是什么?--同上

var b = new Boolean(false)
var b1 = false
if(b){console.log(’b’)}
if(b1){console.log(’b1’)}
//输出:b,因为b是一个对象,所有对象都返回true

4. Object

var o1 = {}

var o2 = new Object()

o1 和 o2 没区别

var o1 = {}
var o2 = new Object()
o1 === o2  //false,因为o1和o2地址不同

公用属性

所有对象都有 toString 和 valueOf 属性,不需要在每个对象里重复,为了节省内存,JS 的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象),然后让每一个对象的 __proto__ 存储这个「公用属性组成的对象」的地址

50b8589fcbc6a021fae97d36b0294be1.png
内存图解

但像Number这样的对象还有自己的一些共用属性(eg: toString(16)转成16进制),所以它的第一个 __proto__存的是Number独有的共用属性,然后有第二个 __proto__存的是所有对象的共用属性。

656770d879411b7694c4be15aa750583.png
内存图解

String、Boolean也同理。

⚠️共用属性也就是原型(prototype)

dd475d84d512010b2605b4d6a070a07f.png
原型链

1095abdfcc0e98284813a4315826c489.png

prototype和_proto__的区别:

prototype是在我们还没写代码时浏览器就准备好了的,是对共用属性的引用(为防止垃圾回收);

__proto__是我们写了代码创建了对象后产生的,也是对共用属性的引用(这个对象被销毁,不再引用共用属性,共用属性也不会被回收,因为prototype会一直指向共用属性)。

f1574d36a4cb093a3eceb8040cb9e07c.png
内存图解

重要公式

var 对象 = new 函数()
对象.__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 的实例!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值