new手写实现
javascript 手写实现 构造函数
<!DOCTYPE html>
<html>
<head>
<title>New</title>
<script type="text/javascript">
//手写一个new操作符
//它创建了一个全新的对象。
//它会被执行[[Prototype]](也就是__proto__)链接。
//它使this指向新创建的对象。。
//通过new创建的每个对象将最终被[[Prototype]]链接到这个函数的prototype对象上。
//如果函数没有返回对象类型Object(包含Functoin, Array, Date, RegExg, Error),那么new表达式中的函数调用将返回该对象引用
function New(fn) {
let res = {};
if (fn.prototype !== null) {
res.__proto__ = fn.prototype;
}
let ret = fn.apply(res, [...arguments].slice(1));
// 下面这个判断是因为构造函数中如果return了一个非基本数据类型,则new出来的结果就是这个return的对象,this会被丢弃
if (
(typeof ret === "object" || typeof ret === "function") &&
ret !== null
) {
return ret;
}
return res;
}
function A(name, age) {
this.name = name;
this.age = age;
}
let obj = New(A, "Niko", 25);
let obj2 = new A("Niko", 25);
console.log(obj);
console.log(obj2);
</script>
</head>
<body></body>
</html>