new
function my_new(func){
// 1. 新建对象
let obj = {}
// 2. 修改原型链
obj.__proto__ = func.prototype
// 3.示例属性获取,并修改this
func.call(obj)
// 4.返回对象
return obj
}
Object.create
function create(Obj){
// 2. 新建构造函数
function F() {}
// 3. 原型链修改
F.prototype = Obj
// 4.新建对象
return new F()
}
call和apply
Function.prototype._call = function (ctx) {
// 1. 构造被调用对象,兼容默认值
var obj = ctx || window
// 2. 获取后续参数
var args = Array.from(arguments).slice(1)
// 3. 获取唯一属性名
var fun = Symbol()
// 4. 增加属性方法,指向待调用函数
obj[fun] = this
var result = obj[fun](...args)
// 5. 执行完毕后,删除该属性
delete obj[fun]
return result
}
Function.prototype._apply = function (ctx) {
var obj = ctx || window
var args = Array.from(arguments).slice(1)
var fun = Symbol()
// 参数处理
var result = obj[fun](args.join(','))
delete obj[fun]
return result
}
bind
Function.prototype._bind = function (ctx) {
// 1. 兼容判断
var ctx = ctx || window
// 2. 保留当前获取参数
var args = Array.from(arguments).slice(1)
var _this = this
// 3. 返回函数
return function F(arguments) {
// 4.判断是否new 场景
if(this instanceof F){
// 5. 此时直接执行构造函数
return new _this(...args, ...arguments)
}else{
// 5. 常规场景,依然绑定this指向,拼接新增参数
return _this.apply(ctx, args.concat(arguments))
}
}
}