萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> JavaScript中的prototype和constructor簡明總結

JavaScript中的prototype和constructor簡明總結

 一直沒弄清楚JavaScript中的prototype和constructor屬性,今天看了看書,總算有點眉目了

一、constructor constructor的值是一個函數。在JavaScript中,除了null和undefined外的類型的值、數組、函數以及對象,都有一個constructor屬性,constructor屬性的值是這個值、數組、函數或者對象的構造函數。如:   代碼如下:var a = 12, // 數字     b = 'str', // 字符串     c = false, // 布爾值     d = [1, 'd', function() { return 5; }], // 數組     e = { name: 'e' }, // 對象     f = function() { return 'function'; }; // 函數   console.log('a: ', a.constructor); // Number() console.log('b: ', b.constructor); // String() console.log('c: ', c.constructor); // Boolean() console.log('d: ', d.constructor); // Array() console.log('e: ', e.constructor); // Object() console.log('f: ', f.constructor); // Function()     以上的構造函數都是JavaScript內置的,我們也可以自定義構造函數,如:    代碼如下: function A(name) {     this.name = name; }   var a = new A('a');   console.log(a.constructor); // A(name)     調用構造函數時,需要用new關鍵字,構造函數返回的是一個對象,看下面的代碼就知道了:   代碼如下:var a = 4; var b = new Number(4);   console.log('a: ', typeof a); // a: number console.log('b: ', typeof b); // b: object     二、 prototype prototype是函數的一個屬性,默認情況下,一個函數的prototype屬性的值是一個與函數同名的空對象,匿名函數的prototype屬性名為Object。如:    代碼如下:function fn() {}   console.log(fn.prototype); // fn { }     prototype屬性主要用來實現JavaScript中的繼承,如:   代碼如下:function A(name) {     this.name = name; }   A.prototype.show = function() {     console.log(this.name); };   function B(name) {     this.name = name; }   B.prototype = A.prototype;   var test = new B('test');   test.show(); // test     這兒有一個問題,test的構造函數其實是A函數而不是B函數:    代碼如下:console.log(test.constructor); // A(name)   這是因為B.prototype = A.prototype把B.prototype的構造函數改成了A,所以需要還原B.prototype的構造函數:  代碼如下:function A(name) {     this.name = name; }   A.prototype.show = function() {     console.log(this.name); };   function B(name) {     this.name = name; }   B.prototype = A.prototype; B.prototype.constructor = B;   var test = new B('test');   test.show(); // test console.log(test.constructor); // B(name)     之所以要這麼做,是因為prototype的值是一個對象,且它的構造函數也就是它的constructor屬性的值就是它所在的函數,即:  代碼如下:console.log(A.prototype.constructor === A); // true  
copyright © 萬盛學電腦網 all rights reserved