JS中建立物件可以直接使用直接量的方式,這裡討論的是定義一個建構器(function)的情況。如下
function Person(name, age) {
this.name = name;
this.age = age;
}
var p = new Person('lily', age;
}
var p = new Person('lily', 20);物件的方式無需new,這讓人感到奇怪。如下
var reg = RegExp('^he$');
測試發現使用或不使用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
嗯,還挺好,程式碼運作正常。
如果這樣的話乾脆就不寫new了,這麼還節省了程式碼量。其它類型也是這樣嗎?試試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
cons. 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的情況可以將其它類型分別轉換成字串,數字和布林類型。
好了,再回到篇頭的那個Person類別。即我們自己寫的類別可以不用new運算元生成物件嗎?
function Person(name, age) {
function Person(name, age) {
this.name = name;
this.age = age;
}
var p = Person('lily', 20);
}
var p = Person('lily', 20);
返回undefined,很明顯不行。因此想不用new的情況去建立Person實例是異想天開的。
如果非要實現呢?其實也可以行,如下
function Person(name, age) {
this.name = name;
this.age = age;
if (this===window) {1. }
}
var p = Person('lily', 20); // object
稍微改造了下Person類別。實際上內部區分了下Person是作為建構器還是函數執行。