jsnew一个对象经历了什么,实现一个简单的new方法

更新时间:2023-06-09 10:47:12 阅读: 评论:0

jsnew⼀个对象经历了什么,实现⼀个简单的new⽅法
对于⼤部分前端开发者⽽⾔,new⼀个构造函数或类得到对应实例,是⾮常普遍的操作了。下⾯的例⼦中通过构造函数与与class类实现了⼀个简单的创建实例的过程。
// ES5构造函数
let Parent = function (name, age) {
this.name = name;
8788this.age = age;
};
Parent.prototype.sayName = function () {
console.log(this.name);
};
const child = new Parent('听风是风', 26);
child.sayName() //'听风是风'
//ES6 class类
class Parent {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayName() {
console.log(this.name);
}
};
const child = new Parent('echo', 26);
child.sayName() //echo
但new不应该像⼀个⿊盒,我们除了知道结果,更应该明⽩过程究竟如何。那么那么这篇⽂章主要围绕两点展开,第⼀,js中new⼀个对象时到底发⽣了什么,第⼆,知道了原理后我们通过js来实现⼀个简单的new⽅法。
⼀、new操作中发⽣了什么?
⽐较直观的感觉, 当我们new⼀个构造函数时, 得到的实例继承了构造器的构造属性(this.name这些) 以及原型上的属性
在《JavaScript模式》这本书中,new的过程说的⽐较直⽩,当我们new⼀个构造器,主要有三步:
1.创建⼀个空对象, 将它的引⽤赋给 this, 继承函数的原型
2.通过 this 将属性和⽅法添加⾄这个对象
3.最后返回 this 指向的新对象, 也就是实例 (如果没有⼿动返回其他的对象)
我们改写上⾯的例⼦,⼤概就是这样:
/
/ ES5构造函数
let Parent = function (name, age) {
//1.创建⼀个新对象,赋予this,这⼀步是隐性的,
// let this = {};butterflies
//2.给this指向的对象赋予构造属性
this.name = name;
this.age = age;
//3.如果没有⼿动返回对象,则默认返回this指向的这个对象,也是隐性的
// return this;
bark};
head teacherconst child = new Parent();
starry sky这应该不难理解,你应该在⼯作中看过类似下述代码中的操作,将this赋予⼀个新的变量(例如that),最后返回这个变量:
// ES5构造函数
let Parent = function (name, age) {
let that = this;
that.name = name;
that.age = age;
return that;
};
大森美玲
const child = new Parent('听风是风', '26');
为什么要这么写呢?我在前⾯说this的创建与返回是隐性的,但在⼯作中为了让构造过程更易可见与更易维护,所以才有了上述使⽤that代替this,同时⼿动返回that的做法;这也验证了隐性的这两步确
实是存在的。
但上述这个解释我觉得不够完美,它只描述了构造器属性是如何塞给实例,没说原型上的属性是如何给实例继承的。
初中英语感叹句我在winter⼤神的重学前端专栏中,看到了⽐较符合我⼼意的,同时也是符合原理的描述:
1.以构造器的prototype属性为原型, 创建新对象
pushback2.将this (也就是上⼀句中的新对象)和调⽤参数传给构造器, 执⾏
3.如果构造器没有⼿动返回对象,则返回第⼀步创建的新对象,如果有,则舍弃掉第⼀步创建的新对象,返回⼿动return的对象。voiceofamerica
到这⾥不管怎么说,你都应该⼤概知道了new过程中会新建对象,此对象会继承构造器的原型与原型上的属性,最后它会被作为实例返回这样⼀个过程。知道了原理,我们来⼿动实现⼀个简单的new⽅法。
⼆、实现⼀个简单的new⽅法
// 构造器函数
let Parent = function (name, age) {
this.name = name;
this.age = age;
};
Parent.prototype.sayName = function () {
console.log(this.name);
};
//⾃⼰定义的new⽅法
let newMethod = function (Parent, ...rest) {
// 1.以构造器的prototype属性为原型,创建新对象;
let child = ate(Parent.prototype);
/shengtang
/ 2.将this和调⽤参数传给构造器执⾏
let result = Parent.apply(child, rest);
// 3.如果构造器没有⼿动返回对象,则返回第⼀步的对象
return typeof result  === 'object' ? result : child;
};
//创建实例,将构造函数Parent与形参作为参数传⼊
const child = newMethod(Parent, 'echo', 26);
child.sayName() //'echo';
//最后检验,与使⽤new的效果相同child instanceof Parent//true
child.hasOwnProperty('name')//true child.hasOwnProperty('age')//true child.hasOwnProperty('sayName')//fal

本文发布于:2023-06-09 10:47:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/139130.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   返回   构造   属性   实例   过程   创建   原型
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图