高级基础考试

1.原型

var object = {}
object.__proto__ ===  Object.protype // 为 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

2.function fn(){
console.log(this)
}
new fn()
new fn() 会执行 fn,并打印出 this,请问这个 this 有哪些属性?这个 this 的原型有哪些属性?

this 自身没有属性(只有一个隐藏的 __proto__ 属性)
this 的原型是 fn.prototype,只有一个属性 constructor,且 constructor === fn(另外还有一个隐藏属性 __proto__,指向 Object.prototype

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

关系:JSON 是一门抄袭/借鉴 JavaScript 的语言,同时也是一种数据交互格式,JSON 是 JavaScript 的子集(或者说 JSON 只抄袭了一部分 JavaScript 语法,而且没有新增任何原创的语法)

区别:JSON 不支持函数、undefined、变量、引用、单引号字符串、对象的key不支持单引号也不支持不加引号、没有内置的 DateMathRegExp 等。
而 JavaScript 全都支持。

拓展:
JSON对象包含两个方法: 用于解析 JavaScript Object Notation  (JSON) 的 parse() 方法,以及将对象值转换为 JSON字符串的 stringify() 方法。除了这两个方法, JSON这个对象本身并没有其他作用,也不能被调用或者作为构造函数调用。

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

```
MVC 是什么
MVC 是一种设计模式(或者软件架构),把系统分为三层:Model数据、View视图和Controller控制器。
Model 数据管理,包括数据逻辑、数据请求、数据存储等功能。前端 Model 主要负责 AJAX 请求或者 LocalStorage 存储
View 负责用户界面,前端 View 主要负责 HTML 渲染。
Controller 负责处理 View 的事件,并更新 Model;也负责监听 Model 的变化,并更新 View,Controller 控制其他的所有流程。

代码说明

var model = {
    data: null,
    init(){}
    fetch(){}
    save(){}
    update(){}
    delete(){}
}
view = {
    init() {}
    template: '<h1>hi</h1'>
}
controller = {
    view: null,
    model: null,
    init(view, model){
        this.view = view
        this.model = model
        this.bindEvents()
    }
    render(){
        this.view.querySelector('name').innerText = this.model.data.name
    },
    bindEvents(){}
}

5.es5生成“类”方法

ES 5 没有 class 关键字,所以只能使用函数来模function Human(name){
    this.name = name
}
Human.prototype.run = function(){}

var person = new Human('frank')码就是一个最简单的类,Human 构造函数创建出来的对象自身有 name 属性,其原型上面有一个 run 属性。

(1)构造函数法
用构造函数模拟”类”,在其内部用this关键字指代实例对象。

function Cat() {

    this.name = "大毛";

  }

生成实例的时候,使用new关键字。

var cat1 = new Cat();

  alert(cat1.name); // 大毛

类的属性和方法,还可以定义在构造函数的prototype对象之上。

Cat.prototype.makeSound = function(){

    alert("喵喵喵");

  }

(2)Object.create()法

var Cat = {

    name: "大毛",

    makeSound: function(){ alert("喵喵喵"); }

  };

然后,直接用Object.create()生成实例,不需要用到new。

var cat1 = Object.create(Cat);

  alert(cat1.name); // 大毛

  cat1.makeSound(); // 喵喵喵

(3)用一个对象模拟”类”。
在这个类里面,定义一个构造函数createNew(),用来生成实例。

var Cat = {

    createNew: function(){

      // some code here

    }

  };

然后,在createNew()里面,定义一个实例对象,把这个实例对象作为返回值。

var Cat = {

    createNew: function(){

      var cat = {};

      cat.name = "大毛";

      cat.makeSound = function(){ alert("喵喵喵"); };

      return cat;

    }

  };

使用的时候,调用createNew()方法,就可以得到实例对象。

 var cat1 = Cat.createNew();

  cat1.makeSound(); // 喵喵喵

这种方法的好处是,容易理解,结构清晰优雅,符合传统的”面向对象编程”的构造,因此可以方便地部署下面的特性。
参考这里写链接内容

6.用过 Promise 吗?举例说明。
如果要你创建一个返回 Promise 对象的函数,你会怎么写?举例说明。
用过 Promise,比如 jQuery 或者 axios 的 AJAX 功能,都返回的是 Promise 对象。

$.ajax({url:'/xxx', method:'get'}).then(success1, error1).then(success2, error2)

如果我自己创建 Promise 对象,我会这么写

function asyncMethod(){
    return new Promise(function (resolve, reject){
        setTimeout(function(){
            成功则调用 resolve
            失败则调用 reject
        },3000)
    })
}

链接

猜你喜欢

转载自blog.csdn.net/wang_liuyong/article/details/81782954