new的实现原理

9 篇文章 0 订阅
new关键字在JavaScript中用于创建构造函数的实例对象。它执行的步骤包括创建新对象、设置构造函数作用域、执行构造函数代码和返回新对象。如果构造函数有return语句,返回对象将决定new的结果。new的实现涉及Object.create方法,确保实例能访问原型链上的属性。文章还举例说明了构造函数无return和有return非对象、对象的情况。
摘要由CSDN通过智能技术生成

new的实现原理

1. new 的原理

JavaScript 中 new 关键词的作用就是执行构造函数,然后返回一个实例对象;在 new 的过程中,根据构造函数的定义,来确定是否需要传递参数。

function Dog(name) {
  this.name = name;
  this.color = '黑色';
}
const d = new Dog('小黑');
console.log(d.color); // 黑色
console.log(d.name); // 小黑

这段代码很容易理解,d 是通过 Dog 这个构造函数生成的一个实例对象。
再来看看一个示列,把上面示列的 new 关键词去掉

function Dog(name) {
  this.name = name;
  this.color = '黑色';
}
const p = Dog('小黑');
console.log(color); // 黑色
console.log(name); // 小黑
console.log(d); // undefined
console.log(d.color); // TypeError: Cannot read property 'color' of undefined
console.log(d.name); // TypeError: Cannot read property 'name' of undefined

从上面代码中可以看到,去掉 new 关键词后,执行 Dog 函数返回的是 undefind。在上面的代码中,this 的指向是全局的 window 对象,所以执行 Dog 其实是给全局环境的 name 和 color 属性赋值了。

那么 new 在生成实例对象过程中到底执行了哪些步骤呢?

总结下来,执行的步骤大致分为以下几步:

创建一个新对象
将构造函数的作用域赋值给新对象(this 指向新创建的对象)
执行构造函数的代码(给新对象添加属性)
返回新对象

构造函数中有 return

在日常写代码中,我们基本上不会在构造函数中加 return;那么如果构造函数有 return,结果会怎么样呢?

function Dog(name) {
  this.name = name;
  return {
    color: '黑色'
  };
}
const d = new Dog('小黑');
console.log(d); // { color: '黑色' }
console.log(d.name); // undefined
console.log(d.color); // 黑色

通过这段代码我们可以看出,当构造函数 return 出来的是一个对象时,new 命令会直接返回构造函数 return 的对象,而不是通过 new 执行生成的与构造函数相关的新对象。
如果构造函数返回的不是对象,那么结果又会是怎样呢?

function Dog(name) {
  this.name = name;
  return '黑色';
}
const d = new Dog('小黑');
console.log(d); // { name: '小黑' }
console.log(d.name); // 小黑

可以看出,当构造函数 return 的不是对象,结果还是会根据 new 关键词的逻辑执行,返回构造函数的实例对象。
总结:执行 new 关键词后,总是得到一个对象,要么是构造函数的实例对象,要么是构造函数 return 语句指定的对象

new 的实现

new 的实现过程中,要注意以下两点:

实例对象可以访问私有属性
实例对象可以访问构造函数原型(constructor.prototype)所在原型链上的属性

const _new = (fn, ...rest) => {
  const nObj = Object.create(fn.prototype);
  const result = fn.call(nObj, ...rest);
  return (typeof result === 'object') ? result : nObj;
};

函数 Object.create(proto,[propertiesObject]) 的作用
Object.create() 方法创建一个新对象,使用现有的对象来提供新创建的对象的 proto
proto

必须,新创建的对象的原型对象;该参数会被赋值给新对象的 proto

propertiesObject

可选。需要传入一个对象,该对象的属性类型参照 Object.defineProperties() 的第二个参数。传入的对象添加到新创建对象的可枚举属性(即其自身的属性,而不是原型链上的枚举属性)对象的属性描述符以及相应的属性名称。

const _new = (fn, ...rest) => {
  const nObj = Object.create(fn.prototype);
  const result = fn.call(nObj, ...rest);
  return (typeof result === 'object') ? result : nObj;
};

function Dog(name) {
  this.name = name;
  this.color = '黑色';
}
const d = _new(Dog, '小黑');
console.log(d.color); // 黑色
console.log(d.name); // 小黑
New Bing是微软推出的一种深度学习模型,用于搜索引擎结果的排序。和传统的搜索排序算法相比,New Bing采用了全新的排序方式,更加聚焦于用户的搜索意图和内容的相关性,以提高搜索结果的质量和准确度。 New Bing的实现原理主要包括以下几个方面: 1. 序列学习 New Bing采用了序列学习的方法,通过对输入的搜索词序列和对应的相关文档序列进行建模,来判断相关文档与搜索词的相关性。这个模型通过深度学习算法学习到了向量空间中的表示,通过比较相似度来决定排名。 2. 语义建模 New Bing的模型还采用了语义建模方法,将语义信息与向量表示结合起来,以更好地捕捉用户的意图。它采用了Word2Vec和词义分解等技术,将文档的主题和相关词汇的向量全部用作了匹配特征。这样可以更准确地判断两个文档的相关性,提升搜索结果的质量。 3. 网络架构 New Bing采用了深度神经网络模型,包括多个层次的神经元,其中各层神经元分别负责输入数据的不同特征的抽取和计算。该模型的复杂度很高,需要进行大量的计算和训练,但由于其具有良好的可扩展性和学习能力,因而能够在更多的数据和场景中发挥更好的效果。 总的来说,New Bing通过采用序列学习、语义建模和深度神经网络结构,实现了更为精准的搜索结果排序。该模型的推出不仅提升了搜索引擎的质量和效率,也为深度学习技术在其他领域的应用和发展打下了基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值