let obj = {}
let func = function() {}
console.log('对象的 __proto__:', obj.__proto__);
console.log('对象的 prototype', obj.prototype);
// prototype 是函数所特有的属性
console.log('函数的 __proto__:', func.__proto__);
console.log('函数的 prototype:', func.prototype);
function myNew() {
// 借助 create 函数,第一步和第三步可以合并为一步
// let obj = Object.create(constructor.prototype)
// 1. 创建一个空的对象
const obj = {}
// 2. 获取构造函数,this 指向新对象,执行构造函数的代码
const constructor = [...arguments][0] // Foo
const result = constructor.apply(obj, [...arguments].slice(1)) // 当前 Foo 没有返回值 所以 result 为 undefined
// 3. 设置对象的原型链, 新对象的 __proto__ 属性指向 构造函数的 prototype
obj.__proto__ = constructor.prototype
// 4. 判断构造函数的返回值
return typeof result === 'object' ? result : obj // 由于 Foo 是 undefined 不是对象, 因此返回创建的对象
}
function myCreate() {
// create 创建一个对象,使其 __proto__ 指向传入的原型
// 1. 创建一个空的构造函数
function F() {}
// 2. 将构造函数的 prototype 指向传入的对象
F.prototype = [...arguments][0]
// 3. 返回新构造函数的实例
return new F()
}
function Foo(name) {
this.name = name
}
Foo.prototype.getName = function() {
console.log(this.name)
}
const foo = myNew(Foo, 'limy')
const foo1 = myCreate(foo)
console.log(foo === foo1.__proto__) // true
js 手写 new、create 方法
最新推荐文章于 2023-02-02 12:28:39 发布