最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript學習筆記之函數(shù)篇(五) : 構造函數(shù)

 更新時間:2014年11月23日 11:06:47   投稿:hebedich  
javascript本身是沒有類的概念,只有函數(shù)的概念。javascript的類實際上也是一個javascript的函數(shù),在這個特殊的函數(shù)中間可以包含變量和其他javascript函數(shù)的引用。那么這個特殊的函數(shù)本身就是javascript所謂類的構造函數(shù)。

Javascript 中的構造函數(shù)與其他語言相比也是不同的。任何通過關鍵字 new 調用的函數(shù)都可以當做構造函數(shù)。
在構造函數(shù)體內,this 指向新創(chuàng)建的對象。如果構造函數(shù)體內沒有顯示的 return 表達式,那么我們就默認返回 this,也就是新建的對象。

復制代碼 代碼如下:

function Foo() {
    this.bla = 1;
}
Foo.prototype.test = function() {
    console.log(this.bla);
};
var test = new Foo();

上面的代碼將 Foo 作為構造函數(shù)進行調用,并將新建對象的原型(__proto__)指向了 Foo.prototype。
如果我們在構造函數(shù)內定義返回的 return 表達式,構造函數(shù)就會返回整個表達式,但這個返回表達式必須為一個對象。

復制代碼 代碼如下:

function Bar() {
    return 2;
}
new Bar(); // a new object
function Test() {
    this.value = 2;
    return {
        foo: 1
    };
}
new Test(); // the returned object

如果 new 被省略,那么函數(shù)將不能返回一個新的對象。

復制代碼 代碼如下:

function Foo() {
    this.bla = 1; // gets set on the global object
}
Foo(); // undefined

上面的例子可能在某些場景下也可以運行,但由于 Javascript 中 this 的工作機制,這里 this 將指向全局對象。

工廠模式

為了能夠不使用關鍵字 new,構造函數(shù)將不得不顯示返回一個值。

復制代碼 代碼如下:

function Bar() {
    var value = 1;
    return {
        method: function() {
            return value;
        }
    }
}
Bar.prototype = {
    foo: function() {}
};
new Bar();
Bar();

上例中使不使用 new 來調用函數(shù) Bar 達到的效果是一樣的,將會返回一個新建的包含 method 方法的對象,這里實際上就是一個閉包。
這里需要注意一點,new Bar() 將不會返回 Bar.prototype,而是在 return 表達式內函數(shù) method 的原型對象。
上例中,使用 new 與否在功能上是無差異的。

通過工廠模式創(chuàng)建新的對象

我們經常被提醒不要使用 new,因為一旦忘記了它的使用將導致錯誤。
為了創(chuàng)建一個對象,我們更愿意使用工廠模式并在工廠模式內構造一個新的對象。

復制代碼 代碼如下:

function Foo() {
    var obj = {};
    obj.value = 'blub';

    var private = 2;
    obj.someMethod = function(value) {
        this.value = value;
    }

    obj.getPrivate = function() {
        return private;
    }
    return obj;
}

盡管上例代碼比使用 new 時更不容易出錯,而且在使用私有變量時將更加方便,但同時也有一些不好的地方:

因為不能共享原型對象,所以需要更多的內存。
為了實現(xiàn)繼承,工廠模式需要拷貝另一個對象的所有方法或者將其作為新對象的原型。
放棄原型鏈只是為了避免使用 new,這似乎與 Javascript 語言的精神相悖。

總結

盡管使用 new 可能比較容易產生錯誤,但這并不能成為放棄使用原型鏈的原因。至于最后采取哪種方式,這需要根據(jù)應用的需求而定。最好的方式就是選擇一種風格并堅持下去。

簡單的說構造函數(shù)就是初始化一個實例對象,對象的prototype屬性是繼承一個實例對象。

相關文章

最新評論

延吉市| 永康市| 竹溪县| 尼勒克县| 临清市| 新郑市| 武隆县| 麻江县| 深圳市| 苍梧县| 庐江县| 潢川县| 云梦县| 牙克石市| 邮箱| 天全县| 商河县| 建始县| 任丘市| 昆明市| 博兴县| 博乐市| 曲靖市| 青田县| 工布江达县| 金平| 宾阳县| 漳州市| 冀州市| 梁河县| 调兵山市| 田林县| 西和县| 鄱阳县| 庆阳市| 景德镇市| 江阴市| 确山县| 沐川县| 临夏市| 赞皇县|