Table of Contents
- 定义所有对象都需要有的属性和方法
- 如果在构造函数中定义,每次都执行,造成了冗余
- 1.对象不可以修改、添加,删除原型的属性
- 2.对象中定义的同名的属性,并没有覆盖原型属性
- 3.对象中定义属性要使用 this.属性 = 值
- constructor
- conttructor的值有两种情况
- 指定prototype属性就是属性对象
- 默认就是自身
- 指定构造函数,
- 可以手动更改
- conttructor的值有两种情况
- __proto__
- proto是一级一级指向祖先元素,最终元素是Object
- 指向父类 __proto__:Person.prototype
- 可以被修改
prototype 指定新的对象
- 原理:
- 在未生成对象时,proto指向的是原始Person.prototype的对象,
- 对象生成时候,改变Person.prototype的对象,不影响proto
- 对象之间赋值:a = b = new A(),b=new B() 但是a对象不变
- 只能写在对象生成之前
new一个对象时候发生了什么?
- 三段式:
- var this = { __proto__:Person.prototype}
- 把圆形和自己连接一起,如果自身没有该属性,则沿着原型向上查找
- var this = { __proto__:Person.prototype}
JavaScript原型链系统
- 分为对象和函数
- 对象有__proto__属性,函数有prototype属性;
- 对象由函数生成;
- 生成对象时,对象的__proto__属性指向函数的prototype属性。
- 总结
- js里所有的对象都有__proto__属性(对象,函数),指向构造该对象的构造函数的原型。
- 只有函数function才具有prototype属性。这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。
- 原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。
Javascript call函数和apply函数
- 两者共同的功能就是改变this的指向
- 两者唯一不同的地方就是传递参数类型,一个是数组
- 函数默认执行就是 函数名.call()来执行
- call如果传递一个参数obj,那么调用call方法对象中的this全部等于obj对象
- 第一个参数是一个对象,比如传递obj ,执行完call(obj),obj就借助调用call的方法中的参数,实现了在obj中定义了参数
- call(obj,参数)
JavaScript闭包
- 1.JavaScript的变量在立即执行函数中,执行完毕就释放了
- 2.JavaScript的变量在循环,if等外部中,也可以访问
JavaScript命名规则
- _ 单下划线:同事等尽量不要修改改动
- 双下划线 系统定义 ,尽量不要修改
原型链
-
原型链修改:
- 给引用值添加属性,__proto__.age = 10 ,
-
对象字面量创建对象
- 绝大多数对象最终都会继承Object
- Object.create() 可以指定原型为null
- undefine 和 null都不是继承Object
- 原型是一种隐士属性,系统构建,自己构建的没有作用
- 对象字面量创建对象的原型,就是Object
- Object.create(原型对象) 这种方式也可以创建一个对象
- 创建对象,一般使用大括号{}
- {} 就是new Object()对象
- 绝大多数对象最终都会继承Object
继承发展史
-
1.传统形式 原型链
- 原理:祖先有一些属性,爷爷辈也有一些属性,父类也有一些属性,实际上只想要祖先的一个属性,这样就继承了一堆无用的属性,(爷爷原型指向祖先的对象,父类原型指向爷爷的对象 new 爷爷() )
- 缺点:过多了继承了没用的属性
-
2.借用构造函数
- 原理:使用call和apply 将构造函数的部分功能直接拿来用
- 缺点:
-
3.共享原型
-
4.圣杯模式
4.扩展延伸知识
5.知识内容个人梳理
6.今天都复习了之前的什么内容
6.今天都复习了之前的什么内容