JS原型链常见面试题分析

构造函数:

function Foo(name,age){
    this.name=name;
    this.age=age;
    this.class='class-1';
}

var f=new Foo('cyy',18);

构造函数--扩展:

所有的引用类型都是构造函数

var a={}  是 var a=new Object() 的语法糖

var a=[] 是 var a=new Array() 的语法糖

function Foo()  是var Foo=new Function() 的语法糖

使用instanceof 判断一个函数是否是一个变量的构造函数

5条原型规则:

1、所有的引用类型(数组,对象,函数),都具有对象的特性,即可自由扩展属性,除了null

var a={};
a.name="aa";
console.log(a);

var b=[];
b.name='bb';
console.log(b);

function c(){}
c.name='cc';
console.log(c);

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

<script>
        var a={};
        var b=[];
        function c(){}
        console.log(a.__proto__);
        console.log(b.__proto__);
        console.log(c.__proto__);
    </script>

3、所有的函数,都有一个prototype属性(显示原型),属性值也是一个普通的对象

4、所有的引用类型,__proto__属性值指向它的构造函数的prototype属性值

5、当试图得到一个对象的属性时,如果这个对象本身没有这个属性,就会去它的__proto__里找(其构造函数的prototype属性中)

<script>
        function Foo(name,age){
            this.name=name;
            this.age=age;
        }
        Foo.prototype.alertName=function(){
            alert(this.name);
        }
        var f=new Foo('cyy',18);
        f.alertName();
    </script>
<script>
        function Foo(name,age){
            this.name=name;
            this.age=age;
        }
        Foo.prototype.alertName=function(){
            alert(this.name);
        }
        var f=new Foo('cyy',18);
        f.consoleName=function(){
            console.log(this.name);
        }
        var item;
        for(item in f){
            //高级浏览器会屏蔽来自原型的属性
            //但还是建议加上这个判断,保持程序的健壮性
            if(f.hasOwnProperty(item)){
                console.log(item);
            }
        }
    </script>
<script>
        function Foo(name,age){
            this.name=name;
            this.age=age;
        }
        Foo.prototype.alertName=function(){
            alert(this.name);
        }
        var f=new Foo('cyy',18);
        f.consoleName=function(){
            console.log(this.name);
        }
        var item;
        for(item in f){
            //高级浏览器会屏蔽来自原型的属性
            //但还是建议加上这个判断,保持程序的健壮性
            if(f.hasOwnProperty(item)){
                console.log(item);
            }
        }
        //f没有toString方法,会去Foo上找
        //Foo没有toString方法,会去Object上找
        //Object如果也没有,就是null
        f.toString();
    </script>
<script>
        function Obj(name){
            this.name=name;
        }
        var o=new Obj();
        console.log(o.toString());
    </script>

instanceof 判断引用类型属于哪个构造函数的方法

<script>
        function Foo(name,age){
            this.name=name;
            this.age=age;
        }
        Foo.prototype.alertName=function(){
            alert(this.name);
        }
        var f=new Foo('cyy',18);
        f.consoleName=function(){
            console.log(this.name);
        }
        console.log(f instanceof Foo);
        console.log(f instanceof Object);
    </script>

如何判断一个变量是数组类型?

<script>
        var a=[];
        console.log(a instanceof Array);
    </script>

写一个原型链继承的实例:

<script>
        function Animal(){
            this.eat=function(){
                console.log('animal eat');
            }
        }
        function Dog(){
            this.bark=function(){
                console.log('dog bark');
            }
        }
        Dog.prototype=new Animal();
        var d=new Dog();
        d.eat();
        d.bark();
    </script>

描述new一个对象的过程:

1、创建一个新对象

2、将this指向这个对象

3、给this赋值

4、返回这个对象

一个原型链继承的实例:

封装DOM查询

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
    <title>demo</title>
</head>
<body>
    <div id="text">这是一段长长的文本</div>

    <script>
        function Ele(id){
            this.elem=document.getElementById(id);
        }

        Ele.prototype.html=function(val){
            var elem=this.elem;
            if(val){
                //设置innerHTML
                elem.innerHTML=val;
                return this;
            }else{
                //获取innerHTML
                return elem.innerHTML;
            }
        }

        Ele.prototype.on=function(type,fn){
            this.elem.addEventListener(type,fn);       return this;
        }

        var text=new Ele('text');
        console.log(text.html());
        text.html('设置了新的html').on('click',function(){
            console.log('clicked');
        });
    </script>
</body>
</html>
(0)

相关推荐

  • 创建object对象的几种方法,以及存值取值

    创建object对象的几种方法,以及存值取值 // 创建空对象var obj = {}; // 存值两种方式obj[name] = "张三丰"; obg.name = " ...

  • JS DOM、BOM事件常见面试题分析

    从基础知识到JSWebAPI: DOM操作 BOM操作 事件绑定 AJAX请求(包含http协议) 存储 DOM可以理解为:浏览器把拿到的html代码,结构化成一个浏览器能识别并且js可操作的一个模型 ...

  • 20个硬件常见面试题

    问1 晶体管基本放大电路有共射.共集.共基三种接法,请简述这三种基本放大电路的特点. 共射:共射放大电路具有放大电流和电压的作用,输入电阻大小居中,输出电阻较大,频带较窄,适用于一般放大. 共集:共集 ...

  • 什么是Python中的单元测试?常见面试题集锦!

    学习完Python之后,接下来面临的问题就是面试找工作,今天小编为大家汇总了10道Python经常面试题,并附带答案,希望能够给找工作的你们带来帮助. 有哪些工具可以帮助查找错误或执行静态分析? Py ...

  • Python数据分析师常见面试题集锦!

    数据分析是Python的就业方向之一,近年来,伴随着国内互联网发展,数据分析开始崭露头角,因此很多开发者都因为薪资和发展前景转行从事数据分析工作.那么你知道如何找到满意的数据分析岗吗?今天小编就跟大家 ...

  • Python爬虫常见面试题!

    众所周知,爬虫是Python重要的应用方向之一,也是学习Python求职的热门岗位.对此,为帮助学员们快速通过面试,小编整理了一些Python爬虫常见面试题,希望能够帮助到你们. 1. 试列出至少三种 ...

  • 数据库常见面试题(附答案)

    阅读指南 文章目录 1.事务四大特性 2.数据库隔离级别 3.MYSQL的两种存储引擎区别(事务.锁级别等等),各自的适用场景 4.索引有B 索引和hash索引 5.聚集索引和非聚集索引 6.索引的优 ...

  • HTTP必知必会——常见面试题总结

    HTTP必知必会——常见面试题总结

  • css常见面试题

    css常见面试题

  • 2021Java常见面试题:java正则表达式语法大全

    一面 自我介绍 项目难度介绍 如何实现延时任务 如何实现限流 线程池的参数 能不能自己实现一个java.lang.String并加载 Redis为什么这么快 epoll和poll的区别 进程同步的方式 ...