prototype和__proto__
JS 代码还没运行的时候,JS 环境里已经有一个 window 对象了,window 对象有一个 Object 属性,window.Object 是一个函数对象,window.Object 这个函数对象有一个重要属性是 prototype,window.Object.prototype 里面有 toString(函数)、valueOf(函数)等属性。
prototype 指向一块内存,这个内存里面有共用属性
__proto__
指向同一块内存
prototype 和 __proto__
的不同点在于
prototype 是构造函数的属性,而 proto 是对象的属性
new的实现原理
new实例化的时候,会执行以下操作。
-
新生成了一个对象newObj
-
将
newObj.__proto__
链接到TargetClass原型上 -
newObj绑定 this到目标类TargetClass上
-
返回新对象newObj
function create() {
let newObj = new Object()
// 获得构造函数 将arguments数组化 并取出第一个值
// shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
let TargetClass = Array.prototype.shift.call(arguments)
// console.log(TargetClass);
// 链接到原型
newObj.__proto__ = TargetClass.prototype
// 绑定this,执行构造函数
let result = TargetClass.apply(newObj, arguments);
// 确保new出来的是obj
return typeof result === 'object' ? result : newObj
}
function Person(name, age) {
this.name = name;
this.age = age;
}
//通过new创建构造实例
let person1 = new Person('user1', 20);
console.log(person1)
//通过create方法创造实例
let person2 = create(Person, 'user2', 18);//调用自定义create实现new
console.log(person2)
new 的作用,就是省那么几行代码。(即语法糖)
参考资料
《JS 的 new 到底是干什么的?》 https://zhuanlan.zhihu.com/p/23987456