在JavaScript中,我們經(jīng)常會(huì)使用關(guān)鍵字new來(lái)創(chuàng)建對(duì)象。new操作符用于創(chuàng)建對(duì)象實(shí)例,其過程分為四步:
1. 創(chuàng)建一個(gè)新對(duì)象。 2. 將該對(duì)象的__proto__屬性指向構(gòu)造函數(shù)的prototype屬性。 3. 執(zhí)行構(gòu)造函數(shù),并將該對(duì)象作為this傳入函數(shù)中。 4. 返回該對(duì)象。
例如:
function Person(name) { this.name = name; } let person1 = new Person('Tom'); console.log(person1.name); // "Tom"
在上面的例子中,我們使用new來(lái)創(chuàng)建了一個(gè)Person對(duì)象實(shí)例,new操作符的作用是將Person函數(shù)變成了一個(gè)構(gòu)造函數(shù),從而可以通過該構(gòu)造函數(shù)創(chuàng)建出Person對(duì)象實(shí)例。
new操作符還有一個(gè)常見的應(yīng)用場(chǎng)景,就是使用構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)繼承。比如我們有一個(gè)Person對(duì)象:
function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log('Hi, I am ' + this.name); } let person1 = new Person('Tom');
我們想要?jiǎng)?chuàng)建一個(gè)Student對(duì)象,繼承自Person對(duì)象,那么可以這樣寫:
function Student(name, grade) { this.grade = grade; Person.call(this, name); } Student.prototype = new Person(); Student.prototype.constructor = Student; let student1 = new Student('Jerry', 3); student1.sayHi(); // "Hi, I am Jerry"
在這個(gè)例子中,我們通過new操作符來(lái)創(chuàng)建了一個(gè)Person實(shí)例,并將其作為Student.prototype的原型,然后再將Student.prototype的constructor指向Student本身,這樣我們就使用構(gòu)造函數(shù)實(shí)現(xiàn)了繼承。
當(dāng)然,有些情況下我們也可以使用Object.create()來(lái)實(shí)現(xiàn)繼承,這種方式也是比較常見的。比如上述例子中的Student對(duì)象,我們也可以這樣來(lái)寫:
function Student(name, grade) { this.grade = grade; Person.call(this, name); } Student.prototype = Object.create(Person.prototype); Student.prototype.constructor = Student; let student1 = new Student('Jerry', 3); student1.sayHi(); // "Hi, I am Jerry"
在這個(gè)例子中,我們使用Object.create()來(lái)創(chuàng)建了一個(gè)以Person.prototype為原型的新對(duì)象,并將其賦值給了Student.prototype,因此Student.prototype繼承了Person.prototype,達(dá)到了同樣的繼承效果。
總之,在JavaScript中,new操作符的作用主要是創(chuàng)建對(duì)象實(shí)例和實(shí)現(xiàn)繼承。我們可以通過構(gòu)造函數(shù)來(lái)創(chuàng)建自己的對(duì)象,并通過原型鏈的方式實(shí)現(xiàn)繼承。