在JavaScript中,new運算子用來建立一個自訂物件實例,或是建構函式內建物件的實例;new建立出來的實例可以存取建構函式Person內的屬性。
本教學操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。
new 的用途
new:new 運算子用於建立一個自訂物件實例,或是建構函數內建物件的實例。啥意思呢,有點拗口,我們先看個栗子先看。
new F() 時,發生了什麼
第一版
栗子在這裡:
function Person(name, age) { this.name = name this.age = age console.log(this) // Person{name: "xuedinge", age: "20"} } Person.prototype.have = "cat" const person = new Person("xuedinge", "20") console.log(person.name) // xuedinge console.log(person.have) // cat console.log(person) // Person{name: "xuedinge", age: "20"}
從這個栗子中,我們可以看到,new 具有以下能力:
1、new 建立出來的實例可以存取建構函式Person內的屬性;
2、new 建立出來的實例可以存取建構函式原型上的屬性;
3、new 可以將建構函式中的this綁定到新建立出來的物件上;
那我們就先針對new的這三個能力先實現一下:
function fakeNew(Fn) { // 创建一个空对象 let obj = new Object() // 将新对象的原型指针指向构造函数的原型 obj.__proto__ = Fn.prototype // 处理除了 Fn 以外的剩余参数 Fn.apply(obj, [].slice.call(arguments, 1)) return obj }
看下效果
function Person(name, age) { this.name = name this.age = age console.log(this) // Person {name: "xuedinge", age: "20"} } Person.prototype.have = "cat" function fakeNew(Fn) { // 创建一个空对象 let obj = new Object() // 将新对象的原型指针指向构造函数的原型 obj.__proto__ = Fn.prototype // 处理除了 Fn 以外的剩余参数 Fn.apply(obj, [].slice.call(arguments, 1)) return obj } const newPerson = fakeNew(Person, "xuedinge", "20") console.log(newPerson.name) // xuedinge console.log(newPerson.have) // 20 console.log(newPerson) // Person {name: "xuedinge", age: "20"}
看來跟new的能力比較相像了。但是當建構函式裡有回傳值時,是怎麼樣子的呢,再看個:
// 当返回值是对象时: function Person(name, age) { this.name = name this.age = age console.log(this) // Person {name: "xuedinge", age: "20"} return { car: "leikesasi" } } Person.prototype.have = "cat" const person = new Person("xuedinge", "20") console.log(person.name) // undefined console.log(person.have) // undefined console.log(person.car) // leikesasi console.log(person) // {car: "leikesasi"}
可以看出,當建構函式有回傳值是物件時,new建立的實例物件就是建構子傳回的結果,當傳回值是普通物件時呢,看下面這個:
// 当返回值是普通值时: unction Person(name, age) { this.name = name this.age = age console.log(this) // Person{name: "xuedinge", age: "20"} return "leikesasi" } Person.prototype.have = "cat" const person = new Person("xuedinge", "20") console.log(person.name) // xuedinge console.log(person.have) // cat console.log(person) // Person{name: "xuedinge", age: "20"}
當傳回值是普通物件時,跟沒有回傳值時,結果是一致的。
相關推薦:javascript學習教學
以上是javascript中new的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!