JS原型链与继承测试
考察知识点
- 原型链基础:理解prototype、proto、constructor之间的关系
- 原型链查找机制:掌握属性查找顺序、属性遮蔽、原型链终点
- 继承实现方式:掌握原型链继承、借用构造函数、组合继承、寄生继承等模式
- instanceof原理:理解instanceof运算符的实现原理和应用场景
- ES6类继承:对比传统继承与ES6 class继承的差异
💡 参考答案在文末
判断题
1
原型链继承可以在创建子类实例时向父类构造函数传递参数。
2
如果ES6子类没有显式定义constructor,会自动添加一个默认constructor并调用super()。
3
在JavaScript中,所有原型链的终点都是 Object.prototype。
4
当访问一个对象的属性时,JavaScript会沿着原型链向上查找,直到找到该属性或到达原型链末端。
5
ES6的class默认运行在严格模式下。
6
使用原型链继承时,子类的原型对象会被父类实例覆盖,导致子类原有的原型方法丢失。
单选题
7
以下代码的输出结果是什么?
JavaScript
function Person(name) {
this.name = name;
return { age: 18 };
}
const p = new Person('Tom');
console.log(p.name);
console.log(p.age);
8
以下代码的输出结果是什么?
JavaScript
const obj = Object.create(null);
console.log(obj.__proto__);
console.log(obj.toString);
9
以下代码的输出结果是什么?
JavaScript
function Foo() {}
const f1 = new Foo();
Foo.prototype = { name: 'bar' };
const f2 = new Foo();
console.log(f1.name);
console.log(f2.name);
10
以下代码的输出结果是什么?
JavaScript
function Parent() {}
Parent.prototype.name = 'parent';
const child = new Parent();
child.name = 'child';
console.log(child.name);
delete child.name;
console.log(child.name);
11
以下代码的输出结果是什么?
JavaScript
const person = {
name: 'parent',
friends: ['Alice', 'Bob']
};
const child = Object.create(person);
child.name = 'child';
child.friends.push('Charlie');
console.log(person.name);
console.log(person.friends);
12
以下代码的输出结果是什么?
JavaScript
const proto = { x: 1, y: 2 };
const obj = Object.create(proto, {
z: {
value: 3,
writable: true
}
});
console.log(obj.x);
console.log(obj.y);
console.log(obj.z);
console.log(obj.hasOwnProperty('x'));
console.log(obj.hasOwnProperty('z'));
13
以下代码的输出结果是什么?
JavaScript
const obj = Object.create(null);
console.log(obj instanceof Object);
function Foo() {}
Foo.prototype = null;
const f = new Foo();
console.log(f instanceof Foo);
14
以下代码的输出结果是什么?
JavaScript
function Foo() {}
const f = new Foo();
console.log(f instanceof Foo);
console.log(f instanceof Object);
console.log(Foo instanceof Function);
console.log(Foo instanceof Object);
15
以下代码的输出结果是什么?
JavaScript
function Parent() {
this.colors = ['red', 'blue'];
}
function Child() {}
Child.prototype = new Parent();
const c1 = new Child();
c1.colors.push('green');
const c2 = new Child();
console.log(c2.colors);
多选题
16
关于构造函数和原型的关系,以下说法正确的有哪些?
17
关于ES6的extends继承,以下说法正确的有哪些?
18
关于ES6的class,以下说法正确的有哪些?
填空题
19
请填写Object.create的简易实现:
JavaScript
function myCreate(proto) {
if (proto === null || typeof proto !== 'object') {
throw new TypeError('Object prototype may only be an Object or null');
}
function F() {}
F.prototype = !!1_proto!!;
return !!2_new F()!!;
}
20
请填写instanceof的简易实现:
JavaScript
function myInstanceof(obj, constructor) {
// 右侧必须是函数
if (typeof constructor !== !!1_function!!) {
throw new TypeError('Right-hand side is not callable');
}
// 获取对象的原型
let proto = !!2_Object.getPrototypeOf(obj)!!;
// 沿原型链查找
while (proto !== !!3_null!!) {
if (proto === constructor.prototype) {
return true;
}
proto = Object.getPrototypeOf(proto);
}
return false;
}
参考答案
1.错误
2.正确
3.错误
4.正确
5.正确
6.正确
7.C
8.B
9.A
10.A
11.B
12.A
13.A
14.A
15.B
16.A;B;C;D;E
17.A;B;C;D;E
18.A;B;C;E
19.proto;new F()
20.function;Object.getPrototypeOf(obj);null
想在手机上练习这套试卷?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码