请写出以下代码的打印结果
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、返回一个新的对象(有返回值且返回值是对象,直接返回该对象,没有的返回值或返回值为非对象,生成构造函数的一个实例)