按照javascript語言精粹中所說,如果在一個函數前面帶上new來調用該函數,那么將創建一個隱藏連接到該函數的prototype成員的新對象,同時this將被綁定到那個新對象上。這個話很抽象,我想用實例來讓自己加深理解。
1.如果就一個函數,沒有返回值,沒有prototype成員,然后使用new,會是什么結果呢?如果一個函數沒有返回值,那么如果不使用new來創建變量,那么該變量的值為undefined.如果用了new,那么就是Object.說明一個函數的默認的Prototype是Object.
function Test1(str) {
this.a = str;
}
var myTest = new Test1("test1");
alert(myTest); //[object Object]
function Test1WithoutNew(str) {
this.a = str;
}
var myTestWithoutNew = Test1WithoutNew("test1");
alert(myTestWithoutNew); //undefined;
2.如果函數有返回值,但是返回值是基本類型。那么new出來的myTest還是object.因為基本類型的prototype還是Object. 而如果不使用new,那么返回值就是string的值。
function Test1(str) {
this.a = str;
return this.a;
}
var myTest = new Test1("test1");
alert(myTest); //Object
function Test1WithoutNew(str) {
this.a = str;
return this.a;
}
var myTestWithoutNew = Test1WithoutNew("test1");
alert(myTestWithoutNew); //"test1"
3。如果函數的返回值為new出來的對象,那么myTest的值根據new出來的對象的prototype而定。
function Test1(str) {
this.a = str;
return new String(this.a);
}
var myTest = new Test1("test1");
alert(myTest); //String "test1"
4。接下來我們開始討論new中的this。如果我們給Test1的prototype中加入一個方法叫get_string(),那么get_string()中的this指的就是這個新對象。能夠得到在new時候賦予該對象的屬性值。
var Test2 = function(str) {
this.a = str;
}
Test2.prototype.get_string = function () {
return this.a;
};
var myTest2 = new Test2("test2");
alert(myTest2.get_string()); //“test2”
var Test2 = function(str) {
this.a = str;
}
Test2.prototype.get_string = function () {
return this.a;
};
var myTest2 = Test2("test2");
alert(myTest2)//undefined
5。如果我們修改了函數的prototype,又會發生什么樣的情況呢? 那么就會發生類似繼承的功能,其實就是js的偽類實現。
function Test1(str) {
this.b = str;
}
Test1.prototype.Get_Test1String = function () {
return this.b;
};
var Test2 = function(str) {
this.a = str;
}
Test2.prototype = new Test1("test1");
Test2.prototype.get_string = function () {
return this.a;
};
var myTest2 = new Test2("test2");
alert(myTest2); //Object
alert(myTest2.get_string()); //"test2"
alert(myTest2.Get_Test1String()); //"test1"