一、创建对象的几种方法
//字面量创建
let obj = { key: 'value '}
//通过new Object创建
let obj = new Object({ key: 'value' })
//通过构造函数创建
let F = function () { this.key = 'value' }
let obj = new F()
//通过Object.create创建
let o = { key: 'value' }
let obj = Object.create(o)
//Object.create创建的对象是用原型链连接的 obj.__proto__ === o,就是将o赋值给obj的原型对象
二、原型链
- instanceof
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
//实现instanceof功能
function instanceof (obj, fn) {
//拿到obj的隐式原型
let proto = obj.__proto__
//遍历原型链
while (proto) {
//和fn的prototype进行比较
if (proto === fn.prototype) {
return true
}
//不相等 顺着原型链继续查找
proto = proto.__proto__
}
//如果到了原型链的顶端还没找到 就返回false
return false
}
三、new运算符
// 实现new方法
let new1 = function (func) {
//第一步 创建一个空对象
let obj = Object.create(func.prototype)
//第二步 绑定上下文并执行构造函数
let fn = func.call(obj)
//判断构造函数返回的结果是不是对象,如果是就当做结果返回,不是就返回第一步所创建的对象
if (typeof fn === 'object') {
return fn
} else {
return obj
}
}
let Foo = function () { this.name = 'value' }
let instance = new1(Foo)
console.log(instance) //Foo {name: 'value'}