前端JavaScript面试技巧笔记(2)

知识点

    #构造函数

一般构造函数的函数名要大写开头;

例:

    function Foo(name,age){
        this.name = name;
        this.age = age;
        this.class = 'class-1';
        //return this //默认有这一行
    }
    var f = new Foo('sodayo',20);

前端JavaScript面试技巧笔记(2)_第1张图片

     #原型规则

所有引用类型(数组、对象、函数)都有一个隐式原型属性_proto_,属性值是一个普通对象;

所有函数,都有一个显示属性prototype,属性值也是一个普通对象;

所有引用类型的隐式原型属性(_proto_)指向它的构造函数的prototype属性值;

当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么就会去它的_proto_(即它的构造函数
的prototype)中寻找;

 前端JavaScript面试技巧笔记(2)_第2张图片

 

上图中在对象f调用alertName()函数时,因为本身没有添加这个函数,就会去自己的构造函数的prototype中找相应的函数,

而第五行已经在构造函数Foo的prototype中添加了alertName()函数,所以可以找到;

    #循环对象自身的属性

前端JavaScript面试技巧笔记(2)_第3张图片

     #原型链

前端JavaScript面试技巧笔记(2)_第4张图片

 

f要调用toString()函数,f本身没有,去f的构造函数Foo()的prototype中找,也没有,因为Foo的prototype也是一个对象,

所以在prototype中没有找到,就要去prototype的构造函数Object()中的prototype去找。

而如果Object()的prototype还找不到,它的proto就为null。

前端JavaScript面试技巧笔记(2)_第5张图片

     #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());

 

你可能感兴趣的:(JavaScript)