牛客最新笔试题解析(二)原型与原型链题目

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 牛客最新笔试题解析(二)原型与原型链题目

前言


这篇文章主要来解析牛客笔试题部分的原型与原型链题目。首先我们先从宏观上了解一下 JavaScript 中的原型与原型链。


prototype


每个函数都有一个属性 prototype ,它就是原型,默认情况下它是一个普通 Object 对象,这个对象是调用该构造函数所创建的实例的原型。


constructor


JavaScript 同样存在由原型指向构造函数的属性:constructor,即 Func.prototype.constructor --> Func


__proto__


JavaScript 中所有对象(除了 null )都具有一个 __proto__ 属性,该属性指向该对象的原型。


原型与原型链总结图


image.png

详解


传送门: JavaScript之彻底理解原型与原型链


题目一: 原型链基础题


function Fn1(name) {
    if(name){
        this.name = name;
    }
}
Fn1.prototype.name="jack"
let a = new Fn1();
console.log('a:', a.name);
function Fn2(name) {
    this.name = name;
}
Fn2.prototype.name="jack"
let b = new Fn2();
console.log('b:', b.name);
复制代码


解析


  • 定义实例 a 时,未传入 nameif (name) false ,无法添加 this.name 属性,当访问 name 属性时,沿原型链查找,打印 Fn1.prototype.name
  • 定义实例 b 时,未传入 namethis.name 赋值为 undefinedb 实例上有 name 属性,打印 b.name


答案


a: jack
b: undefined
复制代码


题目二: 闭包配合原型链


var Foo = (function() {
    var x = 0;
    function Foo() {}
    Foo.prototype.increment = function() {
        ++x;
        console.log(x);
    };
    return Foo;
})();
var a = new Foo();
a.increment();
a.increment();
var b = new Foo();
b.increment();
复制代码


解析


题目中共出现三个函数: 外层立即执行函数、Foo 函数、 increment 函数。返回值为 Foo 函数。


increment 函数与 Foo 函数的上层作用域都是立即执行函数,即这两个函数都可以访问到立即执行函数中的 x 变量


  • a = new Foo(): 创建函数 Foo 的实例 a
  • a.increment(): 实例 a 上没有该函数,沿作用域链查找到 Foo.prototype.increment 函数;increment 函数内部没有变量 x ,获取立即执行函数中 x++x,打印 1(立即执行函数作用域中的 x 修改为 1)
  • a.increment(): 与上一步相同,修改立即执行函数中的 x2 ,打印 2
  • b = new Foo(): 创建函数 Foo 的实例 b
  • b.increment(): 获取立即执行函数中的 x ,修改为 3 ,打印 3


答案


1
2
3
复制代码


题目三: new执行与普通函数执行


var name = 'Jay'
function Person(name){
    this.name = name;
    console.log(this.name)
}
var a = Person('Tom')
console.log(name)
console.log(a)
var b = new Person('Michael')
console.log(b)
复制代码


这应该算是 this 方向的题目,整理时没分好类


解析


  • Person('Tom'): 默认绑定,非严格模式 this -> window ,修改全局 name = 'Tom' ,打印 Tom
  • console.log(name): 打印 Tom
  • console.log(a): Person() 执行无返回值,打印 undefined
  • new Person('Michael'): 定义实例 b ,打印 Michael
  • console.log(b): 打印实例 b


答案


Tom
Tom
undefined
Michael
Person {name: "Michael"}
复制代码


题目四: 表述以下代码的执行结果和原因(推荐看)


var tmp = {};
var A = function() {};
A.prototype = tmp;
var a = new A();
A.prototype = {};
var b = Object.create(tmp);
b.constructor = A.constructor;
console.log(a instanceof A);
console.log(b instanceof A);
复制代码


解析


我先给大家举个例子,咱们就能很轻易地理解该题:


var obj = {x: 1};
var a = obj;
obj = {x: 2};
console.log(a.x);
复制代码


打印结果是 1,为什么?


第二行代码中已经把 a 存放的地址指向最初 obj 指向地址,也就是 {x:1} 的存放地址;之后将 obj 指向新的地址 {x:2}a 地址指向没有收到任何影响,依旧指向 {x:1} 的存放地址,所以打印结果是 1


上面题目与案例是类似的,我们来剖析一下:


// 将A的原型指向 tmp 对象地址
A.prototype = tmp;
// a.__proto__ 指向 A.prototype指向地址,即 tmp 地址
var a = new A();
// 修改A.prototype 指向为空对象 {}
A.prototype = {};
// a.__proto__ 仍然指向 tmp 地址
复制代码


instanceof 判断对象的原型链上是否存在构造函数的原型。只能判断引用类型。


A.prototype 已经修改为 {}a,b 的原型链的原型链为: a.__proto__ -> tmp -> tmp.__proto__ -> Object.prototype -> null


答案


false
false
复制代码


题目五: delete


const Book = {
  price: 32
}
const book = Object.create(Book);
book.type = 'Math';
delete book.price;
delete book.type;
console.log(book.price);
console.log(book.type);
复制代码


解析


delete 只能删除自身属性,不能删除继承来的属性。


  • delete book.price: Book 的属性,只能访问,不能删除
  • delete book.type: 自身属性,可以删除


答案


32
undefined


相关文章
|
1月前
|
测试技术 uml 索引
软件设计师软考题目解析07 --每日五题
本文解析了五道软件设计师软考题目,包括系统测试的目标来源、UML图类型、文件系统索引节点管理、计算机系统软件层次以及HTML中<tr>标记的用途。
56 6
软件设计师软考题目解析07 --每日五题
|
1月前
|
安全 Java 测试技术
软件设计师软考题目解析06 --每日五题
本文解析了五道软件设计师软考题目,包括资源死锁情况、中断与DMA方式的区别、存储器芯片数量计算、系统安全措施以及UML图的应用场景,并分享了作者的生活感受。
78 5
软件设计师软考题目解析06 --每日五题
|
1月前
|
BI 网络安全
软件设计师软考题目解析08 --每日五题
本文解析了五道软件设计师软考题目,包括信号量S的PV操作、最先获得输入信息的程序、文法G生成的字符串特性、包过滤防火墙的过滤依据以及中断的概念。
21 1
软件设计师软考题目解析08 --每日五题
|
1月前
|
物联网 vr&ar
软件设计师软考题目解析09 --每日五题
本文解析了五道软件设计师软考题目,包括CPU执行算术或逻辑运算时使用的寄存器、多级中断嵌套中保护断点和现场最有效的方式、64位与32位微处理器的不同、FTP服务器的默认端口以及“三网合一”所指的三网。
39 4
|
1月前
|
算法 测试技术
软件设计师软考题目解析24 --每日五题
这篇文章提供了软件设计师软考的每日五题解析,包括测试用例设计、软件维护类型、路径覆盖测试、软件维护工具和系统改进等知识点。
27 0
软件设计师软考题目解析24 --每日五题
|
1月前
|
项目管理
软件设计师软考题目解析20之英语题
软件设计师软考中英语题目的解析和答题技巧,帮助考生攻克英语部分的题目。
17 0
软件设计师软考题目解析20之英语题
|
1月前
|
存储 数据安全/隐私保护
软件设计师软考题目解析下午题01
这篇文章提供了对软件设计师软考下午题目的解析,涉及农业基地信息化管理服务平台的人员管理、基地管理、种植管理、投入品管理和信息服务功能,并要求考生根据上下文描述和数据流图来回答问题。
26 0
软件设计师软考题目解析下午题01
|
1月前
|
安全 算法 网络安全
软件设计师软考题目解析15 --每日五题
这篇文章是关于软件设计师软考的题目解析,包括防火墙功能、网络连接分析、DMZ区服务器类型、拒绝服务攻击特点以及公开密钥加密算法的选择题,旨在帮助考生准备考试。
27 0
软件设计师软考题目解析15 --每日五题
|
1月前
|
存储 芯片
软件设计师软考题目解析10 --每日五题
五道软考题目的解析,并提供了详细的答案和解题思路。
52 0
软件设计师软考题目解析10 --每日五题
|
1月前
|
前端开发 数据处理
软件设计师软考题目解析23 --每日五题
每日五题解析,涉及结构化开发方法的特点、数据流图的基本加工、MVC体系结构的优点以及模块间耦合类型的判断等知识点。
14 0

推荐镜像

更多