JavaScript中使用構(gòu)造器創(chuàng)建對象無需new的情況說明
更新時間:2012年03月01日 22:32:50 作者:
JS中創(chuàng)建對象可以直接使用直接量的方式,這里討論的是定義一個構(gòu)造器(function)的情況
如下
復制代碼 代碼如下:
function Person(name, age) {
this.name = name;
this.age = age;
}
var p = new Person('lily', 20);
this.name = name;
this.age = age;
}
var p = new Person('lily', 20);
發(fā)現(xiàn)某些庫代碼中創(chuàng)建正則對象的方式無需new,這讓人感到奇怪。如下
復制代碼 代碼如下:
var reg = RegExp('^he$');
測試發(fā)現(xiàn)使用或不使用new,最后返回的都是正則對象,且typeof它們都是“object”。
復制代碼 代碼如下:
var reg1 = new RegExp('^he$');
var reg2 = RegExp('^he$');
reg1.test('he'); // true
reg2.test('he'); // true
console.log(typeof reg1); // object
console.log(typeof reg2); // object
var reg2 = RegExp('^he$');
reg1.test('he'); // true
reg2.test('he'); // true
console.log(typeof reg1); // object
console.log(typeof reg2); // object
嗯,挺好,代碼運行正常。
如果這樣的話干脆就不寫new了,這么還節(jié)省了代碼量。其它類型也是這樣嗎?試試String/Number/Boolean。
復制代碼 代碼如下:
var str1 = new String(1);
var str2 = String(1);
var num1 = new Number('1');
var num2 = Number('1');
var boo1 = new Boolean(1);
var boo2 = Boolean(1);
console.log(typeof str1); // object
console.log(typeof str2); // string
console.log(typeof num1); // object
console.log(typeof num2); // number
console.log(typeof boo1); // object
console.log(typeof boo2); // boolean
var str2 = String(1);
var num1 = new Number('1');
var num2 = Number('1');
var boo1 = new Boolean(1);
var boo2 = Boolean(1);
console.log(typeof str1); // object
console.log(typeof str2); // string
console.log(typeof num1); // object
console.log(typeof num2); // number
console.log(typeof boo1); // object
console.log(typeof boo2); // boolean
可以看到,與正則的情況不同。正則無論是否new,typeof后都是object。
但String/Number/Boolean類型,new的對象typeof返回是“object”,不new的typeof返回則是“string”。
即不適用new的情況可以將其它類型分別轉(zhuǎn)化成字符串,數(shù)字和布爾類型。
好了,再回到篇頭的那個Person類。即我們自己寫的類可以不用new操作符生成對象嗎?
復制代碼 代碼如下:
function Person(name, age) {
this.name = name;
this.age = age;
}
var p = Person('lily', 20);
console.log(p); // undefined
this.name = name;
this.age = age;
}
var p = Person('lily', 20);
console.log(p); // undefined
返回undefined,很明顯不行。因此想不用new的情況去創(chuàng)建Person實例是異想天開的。
如果非要實現(xiàn)呢?其實也行,如下
復制代碼 代碼如下:
function Person(name, age) {
this.name = name;
this.age = age;
if (this===window) {
return new Person(name, age);
}
}
var p = Person('lily', 20); // object
this.name = name;
this.age = age;
if (this===window) {
return new Person(name, age);
}
}
var p = Person('lily', 20); // object
稍微改造了下Person類。實際上內(nèi)部區(qū)分了下Person是作為構(gòu)造器還是函數(shù)執(zhí)行。
您可能感興趣的文章:
- 用方法封裝javascript的new操作符(一)
- 淺談javascript中new操作符的原理
- JS重學系列之聊聊new操作符
- js構(gòu)造函數(shù)創(chuàng)建對象是否加new問題
- JavaScript 三種創(chuàng)建對象的方法
- JS 創(chuàng)建對象(常見的幾種方法)
- js中創(chuàng)建對象的幾種方式示例介紹
- js創(chuàng)建對象的幾種常用方式小結(jié)(推薦)
- js面向?qū)ο笾R妱?chuàng)建對象的幾種方式(工廠模式、構(gòu)造函數(shù)模式、原型模式)
- javascript的函數(shù)、創(chuàng)建對象、封裝、屬性和方法、繼承
- JS使用new操作符創(chuàng)建對象的方法分析
相關(guān)文章
Javascript四舍五入Math.round()與Math.pow()使用介紹
本文為大家介紹下Javascript中的四舍五入Math.round()與Math.pow()的使用,感興趣的朋友不要錯過2013-12-12javascript實現(xiàn)點擊按鈕彈出一個可關(guān)閉層窗口同時網(wǎng)頁背景變灰的方法
這篇文章主要介紹了javascript實現(xiàn)點擊按鈕彈出一個可關(guān)閉層窗口同時網(wǎng)頁背景變灰的方法,涉及javascript鼠標事件及頁面元素樣式操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05Easyui Tree獲取當前選擇節(jié)點的所有頂級父節(jié)點
這篇文章主要介紹了Easyui Tree獲取當前選擇節(jié)點的所有頂級父節(jié)點,以及easyUI Tree顯示選中節(jié)點的所有父節(jié)點的實現(xiàn)代碼,需要的朋友可以參考下2017-02-02JS與jQuery遍歷Table所有單元格內(nèi)容的方法
這篇文章主要介紹了JS與jQuery遍歷Table所有單元格內(nèi)容的方法,結(jié)合實例形式分別描述了JavaScript與jQuery實現(xiàn)遍歷table單元格的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12Uncaught?SyntaxError:Unexpected?token?'<'?(
這篇文章主要為大家介紹了JS判斷趨近于直線的多邊形(退化多邊形)實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01