原型链

264 阅读1分钟

请写出以下代码的打印结果

function Foo() {
    Foo.a = function() {
        console.log(1)
    }
    this.a = function() {
        console.log(2)
    }
}
Foo.prototype.a = function() {
    console.log(3)
}
Foo.a = function() {
    console.log(4)
}
Foo.a(); // 4
let obj = new Foo(); // 初始化Foo的属性
obj.a(); // 2
Foo.a(); // 1

请实现(5).add(3).minus(2)的功能

// 请在此处完善代码

const result = (5).add(3).minus(2)

// 输出6

console.log(输出结果为${result})

Number.prototype.add = function (number) {
    if (typeof number !== 'number') {
        throw new Error('请输入数字~');
    }
    return this.valueOf() + number;
};
Number.prototype.minus = function (number) {
    if (typeof number !== 'number') {
        throw new Error('请输入数字~');
    }
    return this.valueOf() - number;
};

请模拟实现new操作符,使下面代码正常运行

function myNew(constructor, ...rest) {
 // 请在此处完善代码,不能直接使用 new 操作符
}
function Fun(name,sex) {
  this.name = name
  this.sex = sex
}
Fun.prototype.getUserInfo = function() {
  return `我的姓名${this.name},我的性别${this.sex}`
}

const fun = myNew(Fun,'呵呵','male')
// 我的姓名呵呵,我的性别male
console.log(fun.getUserInfo())
function myNew(constructor, ...rest) {
  if (typeof constructor !== 'function') {
        return constructor;
    }
    //创建新的对象,关联构造函数的原型对象
    const _constructor = Object.create(constructor.prototype);
    //执行构造函数
    const obj = constructor.apply(_constructor, rest);
    //如果构造函数执行结果是对象则返回执行结果
    if (typeof obj === 'object') {
        return obj;
    } else {
        return _constructor;
    }
}

new操作符干的四件事儿:

1、创建一个新对象
2、将构造函数的作用域赋给新对象(链接原型,形成原型链)
3、执行构造函数中的代码(将构造函数的this指向实例)
4、返回一个新的对象(有返回值且返回值是对象,直接返回该对象,没有的返回值或返回值为非对象,生成构造函数的一个实例)