new的原理及实现
2024-10-16 05:31:06
new的过程
// new运算的过程
/**
* 1、创建一个空对象;
* 2、该空对象的原型指向构造函数(链接原型):将构造函数的 prototype 赋值给对象的 __proto__属性;
* 3、绑定 this:将对象作为构造函数的 this 传进去,并执行该构造函数;
* 4、返回新对象:如果构造函数返回的是一个对象,则返回该对象;否则(若没有返回值或者返回基本类型),返回第一步中新创建的对象;
*/
var Person = function(name) {
this.name = name
console.log('name is ', this.name)
}
Person.prototype.getName = function() {
return this.name
}
var objectFactory = function() {
// 1、创建一个空对象
var obj = new Object()
console.log('before shift arguments = ',arguments)
// 获取构造函数Person
Constructor = [].shift.call(arguments)
//因为arguments是类数组,并不是真正的数组,所以不能直接调用数组的shift方法,但是可以通过call调用。
console.log('after shift arguments = ', arguments)
console.log(`Constructor = ${Constructor}`)
// 2、该空对象的原型指向构造函数: 将构造函数的prototype 赋值给空对象的 __proto__属性;
obj.__proto__ = Constructor.prototype
// 3、将空对象作为构造函数的this传进去,并执行该构造函数
var ret = Constructor.apply(obj, arguments)
// 4、返回新对象:如果构造函数返回的是一个对象,则返回该对象;否则(若没有返回值或者返回基本类型),返回第一步中新创建的对象;
return typeof ret == 'object' ? ret : obj
}
var a = objectFactory(Person, 'wyh')
console.log('执行后的name = ', a.name)
new实现的第四步解释:
构造函数返回值有如下三种情况:
- 1、返回一个对象
- 2、没有
return
,即返回undefined
- 3、返回
undefined
以外的基本类型
情况1:返回一个对象
function Car(color, name) {
this.color = color;
return {
name: name
}
}
var car = new Car("black", "BMW");
car.color;
// undefined
car.name;
// "BMW"
实例 car
中只能访问到返回对象中的属性。
情况2:没有 return
,即返回 undefined
function Car(color, name) {
this.color = color;
}
var car = new Car("black", "BMW");
car.color;
// black
car.name;
// undefined
实例 car
中只能访问到构造函数中的属性,和情况1完全相反。
情况3:返回undefined
以外的基本类型
function Car(color, name) {
this.color = color;
return "new car";
}
var car = new Car("black", "BMW");
car.color;
// black
car.name;
// undefined
实例 car
中只能访问到构造函数中的属性,和情况1完全相反,结果相当于没有返回值。
所以需要判断下返回的值是不是一个对象,如果是对象则返回这个对象,不然返回新创建的 obj
对象。
最新文章
- sql server 游标 写给自己
- 升级ruby后再安装cocodPod
- C++ 错误总结
- Sping Environment为Null的原因和解决方法
- Responsive设计的十个基本技巧(转)
- HDU 4343 贪心
- C++一个简单的类
- AFNETWorking3.x实战教程
- maven学习系列教程,第一课(web项目的搭建)
- 《神经网络和深度学习》系列文章十二:Hadamard积,s⊙t
- iomanip
- ASP.NET Core 认证与授权[2]:Cookie认证
- 零基础如何迅速学习HTML5?新手小白学习web前端H5自白!
- 高效管理http连接
- 面向服务的体系架构 SOA(二) --- 服务的路由和负载均衡
- SpringBoot(三):springboot启动参数
- HandlerThread原理分析
- ThetaSome_ThetaAll子查询
- 搭建SpringBoot+dubbo+zookeeper+maven框架(二)
- python学习笔记_week5_模块
热门文章
- computed和watch的用法和区别
- HTTPS各版本安全策略HTTPS1_1_TLS1_0、HTTPS2_TLS1_0、HTTPS2_TLS1_2
- 每天一道Rust-LeetCode(2019-06-11)
- python中使用redis模块, 设置过期时间
- zookeeper图形化的客户端工具(ZooInspector)
- [LeetCode] 112. Path Sum 二叉树的路径和
- chrome浏览器如何查看、修改、删除Cookie
- kubernetes-harbor 私有仓库 帐号与密码 配置
- .NET Core:Json和XML
- Python处理数据集-1