原型定义:
原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的实例对象,可以继承该原型的属性和方法。原型也是对象。
例子释义:
function Person () {};
var person1 = new Person(); // 实例对象person1
var person2 = new Person(); // 实例对象person2
- 当Person函数创建时,Person.prototype属性就已经产生,且值为空对象:Person.prototype = {}
- 实例对象person1 和 实例对象person2是两个类似且独立的对象,他们都有一个公共的祖先prototype,所以他们都会继承prototype的属性和方法:比如Person.prototype.a = 12345,那么person1\person2都有a属性
原型的特点:
- 自己有的属性先找自己,自己没有才去找原型。
- 把共有属性放在原型上,会避免代码的冗余。
- 通过实例对象无法对原型进行增删改,只能查看
- 原型自带的隐式属性:constructor、proto
- 谁调用原型上方法,this就指向谁
原型的属性之一constructor构造器
是构造函数本身,是原型上的属性,可更改
实例对象中的隐式属性:proto
实例对象中的proto属性放的是原型,也就是构造函数的prototype。
例如上例:
person1.proto = Person.prototypt指向的空间
也就说明了,在构造函数构造实例对象的时候,内部隐式声明的this对象里一开始并不是空对象,而是有个proto 属性,该属性指向了构造函数的原型~
proto的作用:
他的作用是连接了实例对象与构造函数的原型,也就是当访问一个实例对象上没有的属性时,他会沿着proto属性指向的原型上去查找。
看题:
一个原型链的终端的Object所有对象的最终都指向Object.prototype(错),对象原型可以用Object.creact(原型)指定。特例:Object.creact(null)
扩展;
1. document.write(value)
这里输出的其实是value.toString()
2. 0.14 100 = ?
call/applay:*
1. 作用:改变this的指向。
2. 区别:传递的参数格式不同
3. 扩展理解下bind()
继承:
- 原型链,儿子原型等于父的实例对象,父的原型等于祖父的实例对象,缺点继承了许多多余的属性
- call/applay,每次构造一个对象都要执行两个构造函数
共有原型,儿子的原型等于父的原型……,无法构建自己的原型,一添加都添加:
Father.prototype.name = ‘wyy’;
function Father () {}
function Son () {}
Son.protutype = Father.prototype;圣杯模式:方法还是用共有原型,找一个中间键
Father.prototype.name = ‘wyy’;
function Father () {}
function Son () {}
function F () {}
F.prototype = Father.prototype;
Son.prototype = new F()
Son.prototype.constructor = Son; // 归位构造函数
Son.prototype.uber = Father.prototype; // 超类,最终继承者或者用Object.creact():
Son.prototype = Object.create(new Father())
