欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS原型链常见面试题分析

程序员文章站 2022-03-26 21:05:05
构造函数: function Foo(name,age){ this.name=name; this.age=age; this.class='class-1'; } var f=new Foo('cyy',18); 构造函数--扩展: 所有的引用类型都是构造函数 var a={} 是 var a= ......

构造函数:

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

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

JS原型链常见面试题分析

 

 

构造函数--扩展:

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

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

JS原型链常见面试题分析

 

 

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

 

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

JS原型链常见面试题分析

 

 

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>

JS原型链常见面试题分析

 

 

    <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>

JS原型链常见面试题分析

 

 

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>

JS原型链常见面试题分析

 

 

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

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

JS原型链常见面试题分析

 

 

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

    <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>

JS原型链常见面试题分析

 

 

描述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>

JS原型链常见面试题分析