原型
今天来学习学习原型的知识
- 定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象
1
2
3
4
5
6
7
8Person.prototype.lastName = 'father';// prototype原型
function Person(){
this.name = 'person'
}
var person = new Person();//person = {name:'person'}
var person1 = new Person();//person = {name:'person'}
console.log(person.lastName)// 'father'
console.log(person1.lastName)// 'father' person 和 person1 公用lastName - 构造函数的内部实现
1
2
3
4
5
6
7
8function Person(){
// var this = {
__proto__:Person.prototype
};
/*...*/
// return this;
}
var person = new Person();- constructor
查询构造器的属性Person.prototype.constructor为Person 所以在调用person.consturctor的时候会返回Person,可以new一下这个属性执行,构造出于person相似的对象
- constructor
- 原型链
当函数使用属性或者方法的时候,会首先从自己的属性和方法中寻找,如果有的话,就执行,如果没有的话,会沿着__proto__属性进行查找,并一直重复这项操作,直到找到,或者查到最顶级(就是Object构造函数的原型,即Object.prototype,它的__proto__为null),返回undefined - call/apply
作用:改变this指向
区别:传参方式不同1
2fn.call(this,name,age,sex);
fn.apply(this,[name,age,sex]); - 继承发展史
- 传统形式 —>原型链 效率低
- 借用构造函数 每次调用多执行一次构造函数
- 共享原型 如果改变原型的话会改变共享这个原型的所有构造函数
- 圣杯模式 比较完美的解决了共享原型的缺点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// 圣杯模式
//第一种写法
var inherit = (function(){
var F = function(){};
return function(Origin, Target){
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructor = Target;
Target.prototype.uber = Origin.prototype;
}
})()
//第二种写法
function inherit(Origin, Target){
function F(){};
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructor = Target;
Target.prototye.uber = Origin.prototype;
}
- 命名空间
管理变量,防止污染全局,适用于模块化开发(感觉现在也不怎么用了,有webpack等打包工具,还有ES6新语法,闭包等方法)