亚洲步兵一区二区三区-日韩精品伦理在线一区-亚洲色诱视频免费观看-久久人妻视频免费观看

廣州總部電話:020-85564311
20年
互聯(lián)網(wǎng)應(yīng)用服務(wù)商
廣州總部電話:020-85564311
20年
互聯(lián)網(wǎng)應(yīng)用服務(wù)商
請(qǐng)輸入搜索關(guān)鍵詞
知識(shí)庫 知識(shí)庫

優(yōu)網(wǎng)知識(shí)庫

探索行業(yè)前沿,共享知識(shí)寶庫

JavaScript 中 new 操作符具體做了什么?很多人都忽略了一點(diǎn)

發(fā)布日期:2025-08-25 08:59:36 瀏覽次數(shù): 807 來源:前端小刷
推薦語
深入解析JavaScript中new操作符的隱藏機(jī)制,掌握構(gòu)造函數(shù)實(shí)例化的核心原理。

核心內(nèi)容:
1. new操作符創(chuàng)建對(duì)象實(shí)例的5個(gè)關(guān)鍵步驟
2. 構(gòu)造函數(shù)返回值對(duì)實(shí)例化結(jié)果的影響
3. 通過代碼示例驗(yàn)證原型鏈綁定規(guī)則
小優(yōu) 網(wǎng)站建設(shè)顧問
專業(yè)來源于二十年的積累,用心讓我們做到更好!

在JavaScript 中,new 操作符用于创建一个由构造函数生成的用户定义的对象实例。当使用 new 操作符调用一个构造函数时,它执行了以下几步操作:

1. 创建一个新的对象

2. 设置原型链

将新创建的对象的原型(__proto__)设置为构造函数的 prototype 属性。

3. 绑定 this

构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。

4. 执行构造函数内部的代码

5. 处理返回值

如果构造函数返回非空对象(包括有对象、数组、函数),则返回该对象;否则,返回刚创建的新对象。

示例代码

以下是一个简单的例子,展示了 new 操作符的工作机制:

  • 构造函数不返回值(相当于返回 undefined
// 定义一个构造函数 
function Person(name, age{
  // this 指向新创建的对象 
  this.name = name;
  this.age = age;
  // 这里不返回任何值
}

// 使用 new 操作符创建 Person 的实例 
const person1 = new Person('qdxs'18);
console.log(person1.name); // 输出: qdxs 
console.log(person1.age);  // 输出: 18 
console.log(person1 instanceof Person); // 输出: true 
console.log(person1.__proto__ === Person.prototype); // 输出: true 
  • 构造函数返回 null
// 定义一个构造函数 
function Person(name, age{
  // this 指向新创建的对象 
  this.name = name;
  this.age = age;
  // 这里返回 null
  return null
}

// 使用 new 操作符创建 Person 的实例 
const person1 = new Person('qdxs'18);
console.log(person1.name); // 输出: qdxs 
console.log(person1.age);  // 输出: 18 
console.log(person1 instanceof Person); // 输出: true 
console.log(person1.__proto__ === Person.prototype); // 输出: true 
  • 构造函数返回 number
// 定义一个构造函数 
function Person(name, age{
  // this 指向新创建的对象 
  this.name = name;
  this.age = age;
  // 这里返回 6
  return 6
}

// 使用 new 操作符创建 Person 的实例 
const person1 = new Person('qdxs'18);
console.log(person1.name); // 输出: qdxs 
console.log(person1.age);  // 输出: 18 
console.log(person1 instanceof Person); // 输出: true 
console.log(person1.__proto__ === Person.prototype); // 输出: true 

上面三个例子中,构造函数返回一些基本类型,在使用 new 生成的对象都是返回新创建的对象。

  • 构造函数返回非空对象
// 定义一个构造函数 
function Person(name, age{
  // this 指向新创建的对象 
  this.name = name;
  this.age = age;
  // 这里返回任一个对象
  return { name'xiaoming'age16 }
}

// 使用 new 操作符创建 Person 的实例 
const person1 = new Person('dzq'30);
console.log(person1.name); // 输出: xiaoming 
console.log(person1.age);  // 输出: 16 
console.log(person1 instanceof Person); // 输出: false 
console.log(person1.__proto__ === Person.prototype); // 输出: false 

上面例子中,构造函数返回一个非空对象:

 return { name'xiaoming'age16 }

结果 new 操作符返回的值就是该非空对象。

手动实现 new 操作符

function myNew(constructor, ...args{
  // 1. 创建一个新的空对象 
  const instance = {};
  // 2. 设置原型链 
  instance.__proto__ = constructor.prototype;
  // 3. 绑定 this,并调用构造函数
  const result = constructor.apply(instance, args);
  // 4. 处理返回值
  if ((typeof result === 'object' && result !== null) || typeof result === 'function') {
    // Object、Array、Function
    return result;
  } else {
    return instance;
  }
}

很多人在手动实现 new 操作符时,只考虑了对象和数组的返回值,却忽略了 Function 类型也需要特殊处理。让我们看一个例子:

  • 使用原生 new 操作符
// 构造函数返回一个函数
function ConstructorWithFunction({
  this.num = 666;
  return function({
    console.log('I am a function!');
  };
}

// 使用原生new操作符
const obj1 = new ConstructorWithFunction();
console.log(typeof obj1); // 输出: 'function'
console.log(obj1.num); // 输出: undefined,因为返回的是函数而不是对象
  • 使用忽略了 Function 类型的 wrongMyNew
function wrongMyNew(constructor, ...args{
  const instance = {};
  instance.__proto__ = constructor.prototype;
  const result = constructor.apply(instance, args);
  // 错误:只检查对象类型,忽略了函数
  if (typeof result === 'object' && result !== null) {
    return result;
  } else {
    return instance;
  }
}

const obj2 = wrongMyNew(ConstructorWithFunction);
console.log(typeof obj2); // 输出: 'object',这是错误的!
console.log(obj2.num); // 输出: 666,但这不是我们期望的结果
  • 使用考虑 Function 类型的 myNew
const obj3 = myNew(ConstructorWithFunction);
console.log(typeof obj3); // 输出: 'function',这才是正确的!

调用 myNew 模拟 new 生成对象

// 定义一个构造函数 
function Person(name, age{
  // this 指向新创建的对象 
  this.name = name;
  this.age = age;
}

// 使用自定义的 myNew 函数来创建 Person 的实例 
const person3 = myNew(Person, 'xiaoliu'28);
console.log(person3.name); // 输出: xiaoliu 
console.log(person3.age);  // 输出: 28 
console.log(person3 instanceof Person); // 输出: true 
console.log(person3.__proto__ === Person.prototype); // 输出: true

总结

new 操作符的核心作用是将一个普通的函数调用转换为构造函数调用,通过以上五个步骤创建并返回一个新的对象实例。理解这个过程对于深入理解 JavaScript 的面向对象编程非常重要。

关键点: 在手动实现 new 操作符时,一定要记住 Function 类型也是需要特殊处理的返回值类型,这是很多开发者容易忽略的细节!

優(yōu)網(wǎng)科技,優(yōu)秀企業(yè)首選的互聯(lián)網(wǎng)供應(yīng)服務(wù)商

優(yōu)網(wǎng)科技秉承"專業(yè)團(tuán)隊(duì)、品質(zhì)服務(wù)" 的經(jīng)營理念,誠信務(wù)實(shí)的服務(wù)了近萬家客戶,成為眾多世界500強(qiáng)、集團(tuán)和上市公司的長期合作伙伴!

優(yōu)網(wǎng)科技成立于2001年,擅長網(wǎng)站建設(shè)、網(wǎng)站與各類業(yè)務(wù)系統(tǒng)深度整合,致力于提供完善的企業(yè)互聯(lián)網(wǎng)解決方案。優(yōu)網(wǎng)科技提供PC端網(wǎng)站建設(shè)(品牌展示型、官方門戶型、營銷商務(wù)型、電子商務(wù)型、信息門戶型、微信小程序定制開發(fā)、移動(dòng)端應(yīng)用(手機(jī)站APP開發(fā))、微信定制開發(fā)(微信官網(wǎng)、微信商城、企業(yè)微信)等一系列互聯(lián)網(wǎng)應(yīng)用服務(wù)。


我要投稿

姓名

文章鏈接

提交即表示你已閱讀并同意《個(gè)人信息保護(hù)聲明》

專屬顧問 專屬顧問
掃碼咨詢您的優(yōu)網(wǎng)專屬顧問!
專屬顧問
馬上咨詢
掃一掃馬上咨詢
掃一掃馬上咨詢

掃一掃馬上咨詢

主站蜘蛛池模板: 亚洲国产欧美日韩变态一区二区三区 | 一区二区日韩av在线| 亚洲精品一区二区三区av3| 日韩国产有码精品一区二在线 | 欧美日韩第一区第二区| 中文字幕丰满熟妇人妻| 69精品人妻区二区三区蜜桃| 日韩免费观看精品视频| 久久久久久很色很黄的网站| 欧美日韩第一区第二区| 丰满人妻一区二区三区av| 夜色av一区二区三区在线观看 | 一区二区三区日韩中文字幕| 久久久999精品麻豆| 超碰资源一区二区三区| 高清青草视频在线观看| 亚洲人妻久久一区二区| 欧美亚洲国产不卡在线| 91国偷自产一区二区三区蜜臀| 亚洲精品日韩欧美在线| 亚洲日本中文字幕免费在线| 亚洲一区二区三区五月天| 亚洲精区二区三区四区麻豆| 少妇性猛交久久久乱大交| 国产盗摄视频精品一区二区三区| 日韩午夜视频中文字幕| 欧美日韩综合一区在线| 欧美综合国产在线综合| 久久久久国产精品不卡| 少妇一区二区三区高清| 欧美日韩精品综合专区| 国产精品久久久看三级| 亚洲欧美综合在线一区| 91精品欧美一区二区| 日韩av中出中文字幕| 日本丰满熟妇55乱偷| 午夜在线视频国产五月天| 99亚洲一区二区三区| 久久久夜色品精品亚洲| 日本一区二区久久人妻高清| 日韩av中出中文字幕|