JS 中 new 操作符

來源:互聯網
上載者:User

標籤:strong   without   test   class   傳回值   理解   type   function   修改   

this對象的理解:

 ( 1 ) this總是指向函數的直接調用者(而非間接調用者);

 ( 2 ) 如果有new關鍵字,this指向new出來的那個對象;

 ( 3 ) 在事件中,this指向觸發這個事件的對象,特殊的是,IE中的attachEvent中的this總是指向全域對象Window。

new操作符具體幹了什麼呢?

 ( 1 ) 建立一個Null 物件,並且 this 變數引用該對象,同時還繼承了該函數的原型。

(2)屬性和方法被加入到 this 引用的對象中。

(3)新建立的對象由 this 所引用,並且最後隱式的返回 this 。

按照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"



JS 中 new 操作符

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.