JS 中 new 操作符


按照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"
復制代碼
 
轉載 http://www.cnblogs.com/RitaRichard/archive/2011/10/12/2208902.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM