上节回顾:计算输入的字符串长度 (两种方法)
第一种方法:直接让count等于字符串长度,按照英文,每个字节长度占一位,如果是中文unicode>255,再加一位。
第二种方法:count从0开始,英文字母加1,中文加2。
测试的时候在控制台输入bytesLength(str),函数名进行调用
1. 原型
原型对于对象来说是祖先的作用,能够提供一些属性和方法,供后代继承
补充:构造函数能和别的区分的唯一的特点就是大驼峰式,new是用来生产对象的
2. 下面的例子中person是晚辈,可以继承祖先的属性,比如名字,在控制台输入person.name时显示的名字是hehe。
原型是一个共有祖先,相当于一个爹有几个儿子,都得跟爹姓,例下面person1.name和person.name输出是一样的东西
当自己身上有属性,显示自己的,自己没有的属性通过继承得到,如下:
P.S:通过对象改原型的东西基本是不可能的,想要修改原型的属性,只能从原型修改
删除属性时delete person.abc,可以删除本来没有的属性会显示true,删除自己的属性;删除祖先的属性会显示true,但是不会被删除,再输入还有祖先的属性
另一些注意点:简化书写
下面是属性的简写:
4. constructor构造器,可以指向它本身,但是可以手动更改,这个时候再次输入car.constructor,答案就是function Person(){}
3. 隐式属性--> __proto__ 里面存的是对象的原型
作用是:最后输入person.name,先在person里面找,找不到的话随着proto的指引去person.prototype里面找
更改原型:指向obj,再次调用proto时,出来的name就是sunny
例(难一点):person.prototype.name='cherry',最后输出都是cherry,这个改的是属性,换句话说,人没变,变得是房间的东西,下面的改人了
但是下面的例子相当于给person.prototype换了个空间,是一个新的person.prototype,类似最下面的//,所以最后输出还是sunny,是原来的__proto__里的person.prototype
与上面答案不一样,因为有new才有//的执行,下面的例子是cherry已经把sunny给覆盖了,
上面的例子是先new了,先把sunny这个对象给生成了
2. 原型链(原型还有原型)
2.1 如何构成原型链
把原型连城链,原型链的连接点就是proto
而下面的Grand也有原型,里面包括toString,Object.prototype是所有对象的最终原型
找toString的时候给出的答案是从object里面来的,原型链的终端
2.2 原型链上的增删改查
查看属性(和原型的一致)就是可近的来,近的没有远了找,一直找到终端,终端没有就undefined
删除(修改,增加)原型链上的原型属性,通过子孙是不可能删除的,通过自己删除
关于修改的特例:调用修改:fortune属性被加到了groud上,card2是新加的
覆盖性的修改是不行的,而上述修改也仅限于引用值,原始值只能覆盖修改
下面的题答案是b 控制台里:person.sayName()
如果调用写的是:person.prototype.sayName(),,,,答案就是a
var obj={};对象自变量的创建形式也有原型
2.3 Object.create(原型)也能创建对象
2.4 绝大多数对象最终都会继承自Object.prototype 错
有例外:因为Object.create(原型)出现特例,下面构造出来的这个对象就没有原型,没原型也没有toString方法
object还是对象(图3),但是点开以后就是没有proto
Object.create(原型)这里头只能放object或者null
人为的给加了一个proto ,不好使,系统不会读 ,不存在继承特性
undefined和null不能调用toString,没有原型不是对象也没法包装类
只有他俩加上你自己构造出来的没有原型的东西没有toString,剩下都有