知识点
#构造函数
一般构造函数的函数名要大写开头;
例:
function Foo(name,age){
this.name = name;
this.age = age;
this.class = 'class-1';
//return this //默认有这一行
}
var f = new Foo('sodayo',20);
#原型规则
所有引用类型(数组、对象、函数)都有一个隐式原型属性_proto_,属性值是一个普通对象;
所有函数,都有一个显示属性prototype,属性值也是一个普通对象;
所有引用类型的隐式原型属性(_proto_)指向它的构造函数的prototype属性值;
当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么就会去它的_proto_(即它的构造函数
的prototype)中寻找;
上图中在对象f调用alertName()函数时,因为本身没有添加这个函数,就会去自己的构造函数的prototype中找相应的函数,
而第五行已经在构造函数Foo的prototype中添加了alertName()函数,所以可以找到;
#循环对象自身的属性
#原型链
f要调用toString()函数,f本身没有,去f的构造函数Foo()的prototype中找,也没有,因为Foo的prototype也是一个对象,
所以在prototype中没有找到,就要去prototype的构造函数Object()中的prototype去找。
而如果Object()的prototype还找不到,它的proto就为null。
#instanceof
instanceof是用于判断引用类型对象是属于哪个构造函数的方法;
用法:a instanceof A
如:上图的f instanceof Foo //true
判断逻辑:一层一层寻找对象a的_proto_看能不能找到A.prototype
#原型链总结
也就是说,在找一个对象的某个属性时要找这么几个地方:
首先找对象本身有没有这个属性;
然后找构造函数有没有这个属性;
然后找构造函数的prototype有没有这个属性;
然后找((构造函数的prototype)的构造函数)的prototype有没有这个属性;
...
到最后找Object的prototype有没有这个属性;
#连续继承方法(自己试的,不知道对不对)
function A(a){this.a = a}
function B(b){this.b = b}
function C(c){this.c = c}
B.prototype = new A(1);
C.prototype = new B(2);
var c = new C(3);
c.a//1
c.b//2
c.c//3
#例题
如何判断一个对象是数组
不能用typeof得到的是object,应该用a instanceof Array
#一个原型链例子——封装dom查询
function Elem(id){
this.elem = document.getElementById(id);
}
Elem.prototype.html = function(val){//内容赋值,不赋值就输出当前页面
var elem = this.elem;
if(val){
elem.innerHTML = val;
return this; //链式操作
}
else{
return elem.innerHTML;
}
}
Elem.prototype.on = function(type,fn){//绑定事件函数
var elem = this.elem;
elem.addEventListener(type,fn)
}
var div1 = new Elem('div1');
console.log(div1.html());