/*
new操作符原理:
1. 创建一个对象
2. 链接到原型,
3. 绑定this
4. 返回新对象
*/
// 第一个参数为构造函数名称 其余参数为给该构造函数传递的参数
function _new() {
let obj = {}
// 获取构造函数
let Con = [].shift.call(arguments)
// 链接到原型,obj可以访问到构造函数原型中的属性
obj.__proto__ = Con.prototype
// 绑定this实现继承 obj可以访问到构造函数中的属性
let res = Con.apply(obj, arguments)
// 返回对象
return typeof res === 'object' ? res : obj;
}
// 测试
function Person(name, age) {
this.name = name
this.age = age
return {
age: age
}
}
var a = _new(Person, "qj", 20)
console.log(a.name)
console.log(a.age)
/*
作用: 判断一个实例是否属于某种类型 一个实例是否是其父类型或者祖先类型的实例。
* */
function _instance(left, right) {
// 获得对象的原型
left = left.__proto__
// 获得类型的原型
let prototype = right.prototype
// 判断对象的类型是否等于类型的原型
while (true) {
if(left === null) {
return false
}
if(left === prototype) {
return true
}
left = left.__proto__
}
}
// test1
function Person(name, age) {
this.name = name
this.age = age
}
var person = new Person()
console.log(_instance(person,Person))
console.log(_instance(person,Object))
console.log(_instance(Person,Function))
console.log(_instance(Person,Object))
// test2
let a = '1234'
console.log(_instance(a,String))
// test3
let b = 123
console.log(_instance(b,Number))