您当前的位置: 首页 > 

暂无认证

  • 0浏览

    0关注

    92582博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

new操作符

发布时间:2021-04-10 17:42:05 ,浏览量:0

目录
    • 1、new 操作符做的事情 - 01
    • 2、new 操作符做的事情 - 02
    • 3、代码
    • 4、new的原理是什么?
    • 5、通过new的方式创建对象和通过字面量创建对象有什么区别?
1、new 操作符做的事情 - 01

1. 创建了一个全新的对象。 2. 将对象链接到这个函数的prototype对象上。 3. 执行构造函数,并将this绑定到新创建的对象上。 4. 判断构造函数执行返回的结果是否是引用数据类型,若是则返回构造函数执行的结果,否则返回创建的对象。

2、new 操作符做的事情 - 02

1. 创建一个全新的对象 (无原型的Object.create(null)) 。目的是保存new出来的实例的所有属性。 2. 将构造函数的原型赋值给新创建的对象的原型。目的是将构造函数原型上的属性继承下来。 3. 调用构造函数,并将this指向新建的对象。目的是让构造函数内的属性全部转交到该对象上,使得this指向改变,方法有三 : apply、call、bind 。 4. 判断构造函数调用的方式,如果是new的调用方式,则返回经过加工后的新对象,如果是普通调用方式,则直接返回构造函数调用时的返回值。

3、代码
function myNew(Constructor, ...args) { // 判断Constructor参数是否是函数 if (typeof Constructor !== 'function') return 'Constructor.apply is not a function'; // 1、创建了一个全新的对象。 let newObject = {}; // 2、将对象链接到这个函数的prototype对象上。 newObject.__proto__ = Constructor.prototype; // 此处是把 1 / 2 步结合到一起 // const newObject = Object.create(Constructor.prototype); // 3、执行构造函数, // 并将this绑定到新创建的对象上。 let result = Constructor.apply(newObject, args); // 4. 判断构造函数执行返回的结果是否是引用数据类型, // 若是则返回构造函数执行的结果, // 否则返回创建的对象。 if ((result !== null && typeof result === 'object') || (typeof result === 'function')) return result; return newObject; }; // 需要被new的函数 function NewTest(args) { this.dataValue = args; return this; }; // 定义参数 let dataObj = { sname: '杨万里', number: 3, web: 'vue' }; let dataArray = [5, 'uniApp', '范仲淹']; // 执行myNew函数 let test = myNew(NewTest, 1, 'JavaScript', '辛弃疾', dataObj, dataArray); console.log(test); // NewTest {dataValue: Array(5)} 
4、new的原理是什么?

new操作符做的事情。

5、通过new的方式创建对象和通过字面量创建对象有什么区别?

对象都是通过new产生。function Foo() {},function是语法糖,内部等同于new Function() 。 let object = { number: 1 } ,使用字面量创建对象,内部也是使用了new Object() 。 对于创建一个对象来说,更推荐使用字面量的方式创建对象。因为使用new Object()的方式创建对象,需要通过作用域链一层层找到Object ,如果使用字面量的方式就没有这个问题。

关注
打赏
1653961664
查看更多评论
立即登录/注册

微信扫码登录

0.5454s