原型
1.引用知识点
1.1全局函数:typeof
1.2引用数据
1.3函数有那些属性
2.原型思想:对象共用内存空间
2.1函数和对象
1)(原型)对象:__proto__属性,所有对象都有的属性,代表着该对象的原型对象
2)所有的函数都有name,length,prototype属性。
- 函数:prototype属性,保存了一个对象,这个对象是 new Object()
- 用函数创建对象(new构造的对象),创建出来的原型对象就是prototype属性的引用对象
- new fn(): 得到一个下面1步骤的对象==>{__proto__:fn.prototype(是一个对象)}
构造函数的步骤:
1。 创建一个空对象,
2。 运行fn函数 函数内部的this就是创建的这个对象
3。 new fn()表达式会生成一个结果(可能是第1步骤的对象,也有可能是其他引用数据),让后结果赋给某个变量
3)同一个函数构建的对象的__proto__指向同一个函数隐式创建的prototype属性,所以共用同一个空间
每new一次就产生一个新对象。所以f1不等于f2
4)不同函数构建的对象
3.原型链
3.1原型链的基本层级
例子理解:
3.2增加 Function链
1)函数的三种创建方法:都隐式或显示的使用new Function()创建。
- 定义式:var fn = function(){}
- 声明式:function fn(){}
- 官方式:var fn = new Function()
2)同理,数组、对象、字符串的创建也使用 new 内置方法()创建的。
- var arr = [] ==>var arr = new Array()
- Array.prototype=new Object()
- Function.prototype = new Object()
3)创建函数,则所有的函数的__proto__为Function的prototype
4)
函数的__proto__和他的属性prototype不是相等的:
函数.__proto__ 代表函数对象的原型对象==》Function.prototype
函数.prototype 代表的是用它创建出来的对象的原型对象
5)
例子理解1:
3.3对象的成员操作和原型对象的操作
1)对象的成员操作
2)原型对象的操作
function fn(name){
this.name = name;
}
fn.prototype = {age :30}
var obj = new fun('karen')
- 原型对象的取值
- var re = obj.age //自己没有就在原型对象里找,也没有就取原型的原型直到null,还没有取undefined
- 原型对象的存值
- fn.prototype = {age:30}; //prototype重新指向新的地方。对于系统内置函数(Arry、Object等)的,不会生效,跳过编译
- obj.__proto__.x = 20;
- fn.prototype.x=20;
- 自定义原型对象的改值
- fn.prototype = {age:30}; //相当于重新给原型对象赋值,覆盖原来的值
- obj.__proto__.x = 20; //修改原型对象里面的属性值
- fn.prototype.x=20; //修改原型对象里面的属性值
- obj.age = 20;//不会修改obj原型对象里age的值;只会在对象obj里添加或修改age的值
- 系统内置函数原型对象的改值
- 系统内置构造函数的原型属性是不可以修改的,可以操作这个对象的属性
- 原型对象的取值
- var re = obj.age //自己没有就在原型对象里找,也没有就取原型的原型直到null,还没有取undefined
- 对象直接操作原型(不用prototype, __proto__)
- f1.life=2 //不管baba是不是原型链上的属性,只在f1本身添加或修改baba属性,不会修改添加原型上的baba属性
- 如果.语法取到的baba是原型链的属性 虽然不能修改(即不能赋值),但是可以操作