字节DCD网络面经

1.实现一个构造函数 Foo,构造函数里面实现一个属性 a,和一个方法 getA,属性 a 能够在构造函数被实例化的时候通过参数设置

1
2
3
4
function Foo (a){
this.a = a;
}
Foo.prototype.getA = function(){return this.a };

2. 写一个构造函数 Bar 继承上面的 Foo, 并且它有一个方法 getB,能够获取到 Bar 实例对象的 b 属性

1
2
3
4
5
6
7
function Bar (a,b){
Foo.call(this, a);
this.b = b;
}
Bar.prototype = Object.create(Foo.prototype); //Object.create
Bar.prototype.constructor = Bar;
Bar.prototype.getB = function(){return this.b };

3. 讲一讲 new 的工作原理

new 做的三件事

  1. 为实例添加私有属性;
  2. 让实例可以访问到构造函数原型所在原型链上的属性;
  3. 如果构造函数返回的不是引用类型,则返回自己创建的 obj;
1
2
3
4
5
6
7
function myNew (func,...arg) {
let obj = {};
let res = func.apply(obj,arg);
Object.setProtoTypeof(obj,func.prototype); // Object.setPrototypeOf
if ((typeof res == 'object'&& res!=null) || typeof res == 'function') return res;
return obj;
}

4. 看代码说输出

1
2
3
4
5
6
7
8
9
10
11
12
var Item = {
id: 1,
getId: function() {
return this.id;
}
};

console.log(Item.getId()); // 1
var func = Item.getId; //
console.log(func());//undefined
//再提问:怎么不修改 Item,使调用 Item 能够输出Item.id
console.log(func.call(Item));

评论