第一题:

填空题

var object = {}
object.__proto__ ===  ????填空1????  // 为 true

var fn = function(){}
fn.__proto__ === ????填空2????  // 为 true
fn.__proto__.__proto__ === ????填空3???? // 为 true

var array = []
array.__proto__ === ????填空4???? // 为 true
array.__proto__.__proto__ === ????填空5???? // 为 true

Function.__proto__ === ????填空6???? // 为 true
Array.__proto__ === ????填空7???? // 为 true
Object.__proto__ === ????填空8???? // 为 true

true.__proto__ === ????填空9???? // 为 true

Function.prototype.__proto__ === ????填空10???? // 为 true
var object = {}
object.__proto__ ===  Object.prototype  // 为 true

var fn = function(){}
fn.__proto__ === Function.prototype  // 为 true
fn.__proto__.__proto__ === Object.prototype // 为 true

var array = []
array.__proto__ === Array.prototype // 为 true
array.__proto__.__proto__ === Object.prototype // 为 true

Function.__proto__ === Function.prototype // 为 true
Array.__proto__ === Function.prototype // 为 true
Object.__proto__ === Function.prototype // 为 true

true.__proto__ === Boolean.prototype// 为 true

Function.prototype.__proto__ === Object.prototype // 为 true

第二题:

function fn(){
    console.log(this)
}
new fn()

new fn() 会执行 fn,并打印出 this,请问这个 this 有哪些属性?这个 this 的原型有哪些属性?

this 的属性只有 __proto__

fn.__proto__ === Function.prototype

this 的原型的属性有 constructor__proto__

Function.prototype.__proto__ === Object.prototype

第三题:

JSON 和 JavaScript 是什么关系?
JSON 和 JavaScript 的区别有哪些?

关系:

JavaScript 是一种流行的脚本语言。

JSON 是一种数据交换格式,是 JavaScript 的一个子集,采用完全独立于语言的文本格式。

JSON 和 JavaScript 对象的字面量写法相似。

区别:

JSON 的数据类型有 object,array,string,number,boolean,null。

Javascript 的数据类型除了 JSON 所拥有的以外还有 undefined,function 和 symbol。

JSON 中的字符串必须用双引号括起,JavaScript 中字符串单双引号都可以。

JSON 中没有变量,所以不能引用,JavaScript中有变量,可以引用。

JSON 中没有原型链,JavaScript有原型链。

第四题:

前端 MVC 是什么?(10分)
请用代码大概说明 MVC 三个对象分别有哪些重要属性和方法。(10分)

MVC 是什么?

MVC(Model-View-Controller)是一种架构模式。它根据代码的分工进行分类。

View 负责视图。

Model 负责数据。

Controller 负责处理事件和业务逻辑。

Controller 监听 View,用户对 View 做出了操作后,Controller 会去调用 Model,Model 与服务器交互,得到数据后返回数据给 Controller,Controller 根据接收到的数据更新 View 视图。

代码示例

View 主要接受一个选择器,获取需要监听的区域,然后返回一个对象给 Controller 操作、更新。

window.View = function(selector){
    return this.document.querySelector(selector)
}

Model 主要负责数据库的初始化、数据的存储和获取,它的方法应该要有 init 、fetch 、save。

window.Model = function(options){
    //通过传入参数获取需要操作数据库
    var resourceName = options.resourceName
    return {
        //初始化数据库
        init:function(){},

        //获取数据:
        fetch:function(){},

        //保存数据
        save:function(){}
        }
}

Controller 负责监听和更新 View,调用 Model 和接受 Model 返回的数据,它应该要有一个 init 方法接收传入的 View 和 Model,并进行初始化和绑定事件操作。

window.Controller = function(options){

    var init = options.init

    var object = {
        view:null,
        model:null,
        init:function(view,model){
            this.view = view
            this.model = model
            this.model.init()
            init.call(this,view,model)
            this.bindEvents.call(this)
        },
    }

    //通过遍历传入的参数,将其添加到 object 对象中
    for(let key in options){
        if(key !== "init"){
            object[key]=options[key]
        }
    }
    
    return object
}

第五题:

在 ES5 中如何用函数模拟一个类?(10分)
function Human(name,city){
    this.name = name
    this.city = city
}
Human.prototype = {
    constructor: Human,
    walk: function(){} ,
    species: function(){} ,
    useTools: function(){} ,
}

构造函数法

function People(name) {
    this.name = name;
}

People.prototype.alive = true;

var xiaoming = new People('小明');

Object.create()

var Chinese = {
    nation: "China",
    alive: true
};

var xiaoming = Object.create(Chinese);

极简方法

var Chinese = {
    createNew: function(){
        var chinese = {};
        chinese.nation = "China";
        chinese.alive = true;
        return chinese;
    }
};

var xiaoming = Chinese.createNew();

第六题:

用过 Promise 吗?举例说明。
如果要你创建一个返回 Promise 对象的函数,你会怎么写?举例说明。

使用过,之前自制 jQuery.ajax 的时候,使用 promise 代替直接传入回调函数。使用 LeanCloud 的时候,从数据库获取和保存数据的时候也使用过。

let test = function(){
    return new Promise(function(resolve, reject){
        if(Math.random() < 0.5){
            resolve('success')
        }else{
            reject('fail')
        }
    })
}