javaScript(三):原型链(共用属性)

全局对象window

Number

如果包装成一个对象,就有一些操作1的函数可以调用。不包装成对象,就是一个1。

历史遗留问题

在实际操作中,n1也可以调用那些函数(n1不是对象,没有key,不可以调用函数),这是为什么呢:

原因:js之父在设计初期,为了满足js要长得像java的要求,设计了var n2 = new Number(1)这种语法,但是大家都喜欢var n2 = 1这种简单的语法,所以有一个临时转换方法:temp = new Number() temp.toString()然后拿到值返回表达式之后将temp删除

小考题

①var n = 2
①n.xxx = 1
③n.xxx = ?//undefined
复制代码

过程:

①首先在stack存储数值2

②新建一个temp对象在堆内存中,把temp的地址给n,temp增加一对key:value(n.xxx = 1),然后删除这个temp对象

新建一个temp,将temp的地址给n,然后调取n.xxx,得到undefined

string

重点API

一:上面的是'a'的Unicode码,下边的是a的16进制的Unicode码

二: 去掉两边的空格(trim)

三:concat(和命令行相似)

四:slice切片(包前不包后)

五:replace替换得到新单词

Boolean

此时f2是一个对象,不属于五个falsy值,强制类型转换会转换为true

小测试

即使都是空对象,但是他们地址不同,所以不可能相等,同理所有新声明的对象都是不相等的

公用属性(原型)

解释:原型就是共有属性 意义:不要浪费去声明同样的属性 方法:声明对象时,除了自定义的key,还有一个隐藏的key__proto__,__proto__去指向共有属性的地址

他们都指向同一个共有属性的地址

不同数据类型的__proto__不同,但他们都是object的第二层

同一个数据类型有自己数据类型的共有属性(第二层),object的共有属性是所有类型的共有属性(最高层)

数据类型的共有属性的存储

object

object.prototype就是object的共有属性,他一直引用object的__proto,避免了其被垃圾回收

number

树状图表示共有属性绑定

当声明一个对象的时候,js引擎就做了两件事:

1:创造一个hash

2:将xxx.__proto__指向xxx.prototype

不写代码就有prototype

在不写代码的情况下,全局变量window下就拥有函数Nunber,String等等,他们的prototype指向一块共有属性,同时自己生成的对象的__proto__也指向这一块共有属性

总结:String.prototype是string的共有属性的引用(防止垃圾回收),s1.__prototype__是String的共有属性的引用(因为s1真的要用这些属性啊)

烧脑的__proto__和prototype

区别:①是对象的属性,②是函数的属性

Object.____proto____ === Function.prototype,因为 Function 是 Object 的构造函数。

Object.prototype.__proto__ 指向 null

function可以构造函数,同时function自身也是函数,这个特性导致其__proto__和prototype互相指向对方,同时引用相同的公用属性

总结

不能断章取义,__proto__和 prototype 只是两个 key 而已 我们一般研究对象的__proto__和函数的prototype 对象.__proto__ === 某函数.prototype 如果把函数看成对象,那么函数.__proto__=== Function.prototype 如果把 Function 看成对象,那么 Function.__proto__=== Function.prototype

1toString()    //报错,语法错误
1.toString()   //报错,JS引擎无法确定这里的`.`是什么意思,是点运算符(对象方法)还是浮点数?
1..toString()    //成功,运算结果"1" 解析: 第二个点被视为点运算符,前面的是浮点数。
1.0.toString()   //成功,运算结果"1" 解析: 第二个点被视为点运算符,前面的是浮点数。
1 .toString()    //成功,运算结果"1" 解析: 用空格和后面的.toString()隔开, 把前面的当成运算式处理
1+2.toString() //报错,JS引擎无法确定这里的`.`是什么意思,是点运算符(对象方法)还是浮点数?
1+2 .toString() //成功,运算结果"12" 解析: 用空格和后面的.toString()隔开, 把前面的当成运算式处理
(1+2).toString() //成功,运算结果"3" 解析: 括号内部的先进行算法运算,在进行类型转换
(1)+(2).toString() //运算结果"12" 解析: 括号内部进行类型修改并将数字n转换为字符串“n “,在进行拼接,然后再应用toString方法。
(1)+(2)+0 .toString() //成功,运算结果"30" 解析: 如果有多个`+`号,且不包含中括号与""的情况下,则把最后一个加号之前的进行数学运算(不管他有没有被括号包住),最后一个加号留作拼接作用。
(1)+(2)+0+(11) .toString() //成功,运算结果"311" 解析: 同上
(1)+(2)+0+12 .toString() //成功,运算结果"312" 解析: 同上
([1]+[2]+[3])+12 .toString() //成功,运算结果"12312" 解析: 如果里面只有方括号(单个数值的数组),则+起连接作用
((1)+(2)+[3])+12+43 .toString()//成功,运算结果"331243" 解析: 如果里面包含圆括号,则先要进行运算,再把运算的结果与后面的内容拼接起来。
(1)+(2)+6+2+5+"(15)"+1+0+(1) .toString() //成功,运算结果"16(15)101"解析: 如果字符串包裹的前面有多个加号,则把字符串双引号前面的进行运算(不管他有没有被圆括号包住),得到的数值拼接上字符串包裹的内容再拼接上之后的内容
复制代码

var obj = { name: 'frank' } 请问 obj.toString 为什么不是 undefined?

因为 obj 以某种方式拥有了 toString 这个属性

obj 拥有 toString 的方式是用过 __proto__ 达到的

obj.__proto__ 存储了Object.prototype的地址(也就是引用关系)

obj.toString === Object.prototype.toString 为 true

转载于:https://juejin.im/post/5cbed307e51d456e266d894d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值