1. 程式人生 > 其它 >Javascript建構函式

Javascript建構函式

     建構函式注意事項:

1.預設函式首字母大寫

2.建構函式並沒有顯示返回任何東西。new 操作符會自動建立給定的型別並返回他們,當呼叫建構函式時,new會自動建立this物件,且型別就是建構函式型別。

3.也可以在建構函式中顯示呼叫return.如果返回的值是一個物件,它會代替新建立的物件例項返回。如果返回的值是一個原始型別,它會被忽略,新建立的例項會被返回。

  function Person( name){
                this.name =name;
            }
    var p1=new Person('John');

等同於:

          function person(name ){
                Object obj =new Object();
                obj.name =name;
  return obj;
            }
  var p1= person("John");

4.因為建構函式也是函式,所以可以直接被呼叫,但是它的返回值為undefine,此時建構函式裡面的this物件等於全域性this物件。this.name其實就是建立一個全域性的變數name。在嚴格模式下,當你補通過new 呼叫Person建構函式會出現錯誤。

5.也可以在建構函式中用Object.defineProperty()方法來幫助我們初始化:

  function Person( name){
                Object.defineProperty(this, "name"{
                    get :function(){
  return name;
                    },
  set:function (newName){
                        name =newName;
                    },
                    enumerable :true, //可列舉,預設為false
  configurable:true //可配置
  });
            }
  var p1=new Person('John');

6.在建構函式中使用原型物件

          //比直接在建構函式中寫的效率要高的多
  Person.prototype.sayName= function(){
  console.log(this.name);
            };

但是如果方法比較多的話,大多人會採用一種更簡潔的方法:直接使用一個物件字面形式替換原型物件,如下:

          Person.prototype ={
                sayName :function(){
  console.log(this.name);
                },
                toString :function(){
  return "[Person "+ this.name+"]" ;
                }
            };

這種方式非常流行,因為你不用多次鍵入Person.prototype,但有一個副作用你一定要注意:

使用字面量形式改寫了原型物件改變了建構函式的屬性,因此他指向Object而不是Person。這是因為原型物件具有一個constructor屬性,這是其他物件例項所沒有的。當一個函式被建立時,它的prototype屬性也被建立,且該原型物件的constructor屬性指向該函式。當使用物件字面量形式改寫原型物件時,其constructor屬性將被置為泛用物件Object.為了避免這一點,需要在改寫原型物件的時候手動重置constructor,如下:

              Person.prototype ={
                constructor :Person,
                sayName :function(){
  console.log(this.name);
                },
                toString :function(){
  return "[Person "+ this.name+"]" ;
                }
            };

再次測試:

p1.constructor===Person
true
p1.constructor===Object
false
p1 instanceof Person
true