JS面试2--原型

2019-04-09  本文已影响0人  写给我的公主的简书

原型

  1. 所有的引用类型(对象、数组、函数)都可以随意扩展属性(null除外)
var a =  {};
a.a=1
a.b='abc'
a.c=function(){}
  1. 所有的引用类型都有一个__proto__(隐式原型)属性
var a =  {};
console.log(a.__proto__)
  1. 所有的函数都有一个prototype(显示原型)属性
var foo =  function(){};
console.log(foo.prototype)

4.所有的引用类型(数组、对象、函数),__proto__属性指向其构造函数的prototype属性值

console.log(a.__proto__ === Object.prototype)

5.当获取对象的属性时,如果对象本身没有这个属性,就会去它的__proto__(即它的构造函数的prototype)中寻找

function Foo(name){
  this.name = name;
}
Foo.prototype.sayName = function(){
  alert(this.name);
}
var foo = new Foo('zhangsan');
foo.sayName();

补充:

1.遍历对象自身属性

function bianli(f){
    var item;
    var list = [];
    for(item in f){
        if(f.hasOwnProperty(item)){
            list.push(item);
        }
    }
    return list;
}

原型链

function Foo(name){
  this.name = name;
}
Foo.prototype.sayName = function(){
  alert(this.name);
}
var foo = new Foo('zhangsan');
foo.sayName();
/*
    * foo的__proto__中并不存在toString()
    * 由于foo.__proto__实质上也是一个对象,所以会继续向它的原型上查找
    * foo.__proto__.__proto__ === Object.prototype
    * 最终在Object.prototype上找到了 toString方法
    * 也就是 foo.__proto__.__proto__上找到了toString()
*/
foo.toString();
image.png

补充:

1.为避免死循环

Object.prototype.__proto__ === null
image.png

2.instanceof 是用于判断引用类型属于哪个构造方法的方法

/*
    * 逻辑 :
    * 从foo.__proto__上能否查找到foo.__proto__===Foo.prototype
    * 找到则返回true否则false
    * 由于foo.__proto__=== Foo.prototype
    * 由于foo.__proto__.__proto__=== Object.prototype
*/
console.log(foo instanceof Foo)   //true
console.log(foo instanceof Object)   //true

面试题

image.png
var f = [];
f instanceof Array;   //true
typeof f;   //Object  注意:无法使用typeof 判断
function People(name,age){
    this.name = name;
    this.age = age;
}
function Man(){
    this.sex = 'Male';
}

Man.prototype = new People();

var lisi = new Man();
lisi.name = 'lisi';
lisi.age = '18';
console.log(lisi.name+lisi.age);
console.log(lisi instanceof People);  //true
image.png
上一篇下一篇

猜你喜欢

热点阅读