本篇文章為大家帶來了關於javascript的相關知識,其中主要介紹了關於new的相關問題,new運算子創建一個用戶定義的物件類型的實例或具有建構函數的內建物件類型之一,希望對大家有幫助。
【相關推薦:javascript影片教學】
什麼是new
呢?
new
運算子建立一個使用者定義的物件類型的實例或具有建構函數的內建物件類型之一。
光看定義還是有幾分晦澀,直接看一個具體的例子,來了解一下JavaScript
中的new
實現的功能。
// 现实中瘦不了,但网络中一定要保持苗条 function Thin_User(name, age) { this.name = name; this.age = age; } Thin_User.prototype.eatToMuch = function () { // 白日做梦吧,留下肥胖的泪水 console.log('i eat so much, but i\'m very thin!!!'); } Thin_User.prototype.isThin = true; const xiaobao = new Thin_User('zcxiaobao', 18); console.log(xiaobao.name); // zcxiaobao console.log(xiaobao.age); // 18 console.log(xiaobao.isThin); // true // i eat so much, but i'm very thin!!! xiaobao.eatToMuch();
透過上面這個例子,我們可以發現xiaobao
可以:
Thin_User
中屬性Thin_User.prototype
中屬性new 做了這些事:
指向新物件
new#是關鍵字,我們無法像模擬陣列高階方法一樣覆蓋,因此我們寫一個函數
createObject
,來模擬
function Thin_User(name, age) {} const u1 = new Thin_user(...) const u2 = createObject(Thin_User, ...a\)
根據上面分析,
obj#建立一個新物件
)使用
返回
obj#call/apply,可以看JavaScript之手撕call、apply
#學習完這些,我們就可以寫第一版程式碼:
function createObject(Con) { // 创建新对象obj // var obj = {};也可以 var obj = Object.create(null); // 将obj.__proto__ -> 构造函数原型 // (不推荐)obj.__proto__ = Con.prototype Object.setPrototypeOf(obj, Con.prototype); // 执行构造函数 Con.apply(obj, [].slice.call(arguments, 1)); // 返回新对象 return obj;}#傳回值效果
眾所周知,函數是有傳回值的,那麼建構子如果有回傳值,最後執行
new
後傳回的結果是怎樣的那?
假設建構子傳回值為一個基本型,我們來看看最後的回傳結果:
function Thin_User(name, age) { this.name = name; this.age = age; return 'i will keep thin forever'; } Thin_User.prototype.eatToMuch = function () { console.log('i eat so much, but i\'m very thin!!!'); } Thin_User.prototype.isThin = true; const xiaobao = new Thin_User('zcxiaobao', 18); console.log(xiaobao.name); // zcxiaobao console.log(xiaobao.age); // 18 console.log(xiaobao.isThin); // true // i eat so much, but i'm very thin!!! xiaobao.eatToMuch();
function Thin_User(name, age) { this.name = name; this.age = age; return { name: name, age: age * 10, fat: true } } Thin_User.prototype.eatToMuch = function () { // 白日做梦吧,留下肥胖的泪水 console.log('i eat so much, but i\'m very thin!!!'); } Thin_User.prototype.isThin = true; const xiaobao = new Thin_User('zcxiaobao', 18); // Error: xiaobao.eatToMuch is not a function xiaobao.eatToMuch();###當我執行###eatToMuch###時,控制台直接報錯,沒有當前函數,於是我列印了## #xiaobao###物件:############發現###xiaobao###物件的###age###發生了改變,而且增加了###fat###屬性,剛好與建構函數的回傳值一樣。 ######看完這兩個例子,基本上可以理清建構函式有回傳值的情況:###當建構子回傳值為物件時,直接傳回這個物件。 #########終版模擬###
function createObject(Con) { // 创建新对象obj // var obj = {};也可以 var obj = Object.create(null); // 将obj.__proto__ -> 构造函数原型 // (不推荐)obj.__proto__ = Con.prototype Object.setPrototypeOf(obj, Con.prototype); // 执行构造函数,并接受构造函数返回值 const ret = Con.apply(obj, [].slice.call(arguments, 1)); // 若构造函数返回值为对象,直接返回该对象 // 否则返回obj return typeof(ret) === 'object' ? ret: obj;}###【相關推薦:###javascript影片教學###】####
以上是JavaScript把new給拿捏住了的詳細內容。更多資訊請關注PHP中文網其他相關文章!