国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

《javascript語言精粹》學(xué)習(xí)筆記 - 繼承

harriszh / 2879人閱讀

摘要:但采用構(gòu)造器調(diào)用模式,即是使用了前綴去調(diào)用一個(gè)函數(shù)時(shí),函數(shù)執(zhí)行的方式會(huì)改變。對(duì)象包含構(gòu)造器需要構(gòu)造一個(gè)新的實(shí)例的所有信息。構(gòu)造器的變量和內(nèi)部函數(shù)變成了該實(shí)例的私有成員。

  

JavaScript 是一門弱類型語言,從不需要類型轉(zhuǎn)換。對(duì)象繼承關(guān)系變得無關(guān)緊要。對(duì)于一個(gè)對(duì)象來說重要的時(shí)它能夠做什么,而不是它從哪里來。

閱讀《javascript語言精粹》筆記!

偽類

js的原型存在許多的矛盾,它不能直接讓對(duì)象從另外一個(gè)對(duì)象繼承,反而出現(xiàn)了一個(gè)多余的簡介曾:通過構(gòu)造函數(shù)來產(chǎn)生對(duì)象。

當(dāng)函數(shù)對(duì)象創(chuàng)建的時(shí)候,function構(gòu)造器產(chǎn)生的函數(shù)對(duì)象會(huì)運(yùn)行類似這樣的代碼:

function Person() {};
Person.prototype = {
    constructor: this;
};

新的函數(shù)匯賦予一個(gè)prototype的值,因?yàn)?b>js語言沒有提供一個(gè)方法去確定哪個(gè)函數(shù)式打算來做構(gòu)造器的,所以每個(gè)函數(shù)都會(huì)有一個(gè)prototype的對(duì)象。而關(guān)心的是prototype對(duì)象,而不是constructor

但采用構(gòu)造器調(diào)用模式,即是使用了new前綴去調(diào)用一個(gè)函數(shù)時(shí),函數(shù)執(zhí)行的方式會(huì)改變。

Function.method("new", function(){
    var that = Object.create(this.prototype),
        other = this.apply(this, arguments);

    return (typeof other === "object" && other) || that;
});

先創(chuàng)建一個(gè)新的對(duì)象,它繼承自構(gòu)造器函數(shù)的原型對(duì)象

調(diào)用構(gòu)造器函數(shù),綁定this到新的對(duì)象上面

如果它的放回值不是一個(gè)對(duì)象的話,就放回哪個(gè)新對(duì)象

來定義兩個(gè)構(gòu)造器并擴(kuò)展它的原型:

function Person(name) {
    this.name = name;
};  
Person.prototype.sayName = function(){
     alert(this.name);
};

function Cat(name) {
    this.name = name;
};

可以讓另一個(gè)偽類去繼承Person,通過定義它的constructor函數(shù)并且替換了它prototype為一個(gè)Person的實(shí)例來實(shí)現(xiàn):

Cat.prototype = new Person;

然后來給Catprototype上添加一個(gè)方法:

Cat.prototype.sayHello = function(){
    alert("Hello");
};

最后實(shí)例化Cat并且調(diào)用它的方法:

var cat = new Cat("john");
cat.sayName(); // john
cat.sayHello(); // Hello

最后還有修改Catconstruction指向:

Cat.prototype.constructor = Cat;

可以通過使用method方法來定義一個(gè)inherits方法來實(shí)現(xiàn)偽類的繼承:

Function.method("inherits", function(Parent){
    this.prototype = new Parent;
    return this;
});

偽類模式繼承的問題:

沒有私有環(huán)境,所有屬性都是公開的。無法訪問super(父類)方法。

如果在調(diào)用構(gòu)造器函數(shù)時(shí)候忘記調(diào)用new操作符,那么this將不會(huì)綁定到新的對(duì)象上,而是全局window上。

“偽類”的形式可以給不收悉js的程序員便利,但它也隱藏了該語言的真實(shí)本質(zhì)。借鑒類的表示法可能誤導(dǎo)程序員去編寫過于深入與復(fù)雜的層次結(jié)構(gòu)。

construction的指向錯(cuò)誤。

對(duì)象說明符

有的時(shí)候,構(gòu)造器可能要接受一大串的參數(shù),而且還要記住參數(shù)的順序是很困難滴,在這種情況下,編寫構(gòu)造器的時(shí)候讓它接受一個(gè)對(duì)象說明符,可能會(huì)更加的方便。

function Person(name, age, sex, scholl, add) {};

參數(shù)改成對(duì)象說明符的形式:

function Person({
    name: "john",
    age: 16,
    sex: "man",
    scholl: "zhyz",
    add:  "zhuhai"
});

好處:現(xiàn)在能夠多個(gè)參數(shù)按照任意順序去排列,如果構(gòu)造器會(huì)聰明的使用默認(rèn)值,一些參數(shù)可以被忽略掉,并且代碼更加容易的閱讀。

原型
  

在一個(gè)純粹的原型繼模式中,我們會(huì)摒棄類,轉(zhuǎn)而專注于對(duì)象。

基于原型的繼承先對(duì)基于類的繼承在概念上更加簡單:一個(gè)對(duì)象可以繼承以舊的對(duì)象。

用對(duì)象字面量來創(chuàng)建一個(gè)對(duì)象:

var Person = {
    name: "john",
    sayName: function(){
        alert(this.name);
    },
    sayHello: function(){
        alert("Hello");
    }
};

有了想要的對(duì)象后,就可以利用Object.create方法來構(gòu)造出更多的實(shí)例:

var nPerson = Object.create(Person);
nPerson.sayName(); // john
  

這是一種差異化繼承。通過定制一個(gè)新的對(duì)象,我們指明它與所基于的基本對(duì)象的區(qū)別。

下面的例子演示了如何使用Object.create來實(shí)現(xiàn)類式繼承。這是一個(gè)單繼承。(來自MDN)

//Shape - superclass
function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype.move = function(x, y) {
    this.x += x;
    this.y += y;
    console.info("Shape moved.");
};

// Rectangle - subclass
function Rectangle() {
  Shape.call(this); //call super constructor.
}

Rectangle.prototype = Object.create(Shape.prototype);

var rect = new Rectangle();

rect instanceof Rectangle //true.
rect instanceof Shape //true.

rect.move(1, 1); //Outputs, "Shape moved."
函數(shù)化

大部分所看到的繼承模式的一個(gè)弱點(diǎn)就是沒辦法去保護(hù)隱私。對(duì)象的屬性都是可見的。沒有辦法得到私有的變量和函數(shù)。

var consturctor = function(spec, my){
    var that,   // 其他的私有實(shí)例變量
        my = my || {};

    // 把共享的變量和函數(shù)添加到 my 中
    // 給 that = 一個(gè)新的對(duì)象
    // 添加給 that 的特權(quán)方法

    // 最后把 that 對(duì)象返回
    return that;
};

創(chuàng)建一個(gè)對(duì)象。

定義私有實(shí)例的變量和方法。

給這個(gè)新的對(duì)象擴(kuò)充方法,這些方法擁有特權(quán)去訪問參數(shù)。

返回那個(gè)對(duì)象。

spec對(duì)象包含構(gòu)造器需要構(gòu)造一個(gè)新的實(shí)例的所有信息。spec的可能會(huì)被復(fù)制到私有變量中,或者被其他函數(shù)改變,或者方法可以在需要的時(shí)候訪問spec的信息。

聲明該對(duì)象私有的實(shí)例變量的方法。通過簡單地聲明變量就可以做到了。構(gòu)造器的變量和內(nèi)部函數(shù)變成了該實(shí)例的私有成員。

my對(duì)象是一個(gè)為繼承鏈中的構(gòu)構(gòu)造器提供的秘密共享的容器。通過給my對(duì)象添加共享秘密成員:

my.member = value;

然后構(gòu)造一個(gè)新的對(duì)象并且把它賦值給that。接著擴(kuò)充that,加入組成該對(duì)象接口的特權(quán)方法。可以分配一個(gè)新函數(shù)成為that的成員方法,然后再把它分配給that

var methodical = function(){ ... };
that.methodical = methodical;

分兩步去定義methodical的好處就是,如果其他方法想要調(diào)用methodical,它們可以直接調(diào)用methodical()而是不是that.methodical()。如果實(shí)例遭到破壞或修改,調(diào)用methodical照樣會(huì)繼續(xù)工作,因?yàn)樗鼈兯接械?b>methodical不會(huì)該實(shí)例被修改的影響。

最后把that返回。

函數(shù)化模式有很大的靈活性。它相比偽類模式不僅帶來的工作更少,還讓我們得到更好的封裝和信息隱藏,以及訪問父類方法的能力。

如果對(duì)象的所有狀態(tài)都是私有的,那么該對(duì)象就成為一個(gè)“防偽”對(duì)象。該對(duì)象的屬性可以被替換或刪除,但該對(duì)象的完整性不會(huì)受到傷害。

部件

從一套部件中吧對(duì)象組裝出來。例如,構(gòu)造一個(gè)給任何對(duì)象添加簡單事件處理特性的函數(shù)。他會(huì)給對(duì)象添加一個(gè)on方法、一個(gè)fire方法和一個(gè)私有的事件注冊(cè)表對(duì)象。

用這種方法,一個(gè)構(gòu)造器函數(shù)可以從一套部件中把對(duì)象組裝出來。js的弱類型在這里就是一個(gè)巨大的優(yōu)勢(shì),因?yàn)闊o需花費(fèi)精力去了解對(duì)象在類型系統(tǒng)中的集成關(guān)系。

var eventuality = function(that){
    var registry = {};

    that.fire = function(e){
        var arry, func, handler, i,
            type = typeof e === "string" ? e : e.type;

        if (registry.hasOwnProperty(type)) {
            array = registry[type];
            for (i = 0; i < array.length; i += 1) {
                handler = array[i];
                func = handler.method;
                if (typeof func === "string") {
                    func = this[func];
                }
                func.apply(this, handler.parameters || [e]);
            }
        }
        return this;
    };

    that.on = function(type, method, parameters){
        var handler = {
            method;: method,
            parameters: parameters
        };
        if (registry.hasOwnProperty(type)) {
            registry[type].push(handler);
        } else {
            registry[type] = [handler];
        }
        return that;
    };

    return that;
};

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85566.html

相關(guān)文章

  • 【閱讀筆記javascript 語言精粹

    摘要:前言由于最近的項(xiàng)目用到了一些的代碼,所以我?guī)е闷嫘模J(rèn)真閱讀了這本書,粗略地了解語言的基本結(jié)構(gòu)和特性,對(duì)于一些不熟悉的新概念,以記錄的形式加強(qiáng)印象,也是對(duì)學(xué)習(xí)的反思總結(jié)。 前言 由于最近的項(xiàng)目用到了一些js的代碼,所以我?guī)е闷嫘模J(rèn)真閱讀了這本書,粗略地了解js語言的基本結(jié)構(gòu)和特性,對(duì)于一些不熟悉的新概念,以記錄的形式加強(qiáng)印象,也是對(duì)學(xué)習(xí)的反思總結(jié)。 一、字面量(literals...

    tangr206 評(píng)論0 收藏0
  • 讀書筆記-1【javascript語言精粹繼承

    摘要:使用構(gòu)造器有個(gè)嚴(yán)重的危害,如果在調(diào)用構(gòu)造器函數(shù)的時(shí)候忘記使用前綴,不僅不會(huì)綁定到新對(duì)象,還會(huì)污染全局變量原型模式原型模式中,我們采用對(duì)象來繼承。 構(gòu)造器調(diào)用模式 當(dāng)一個(gè)函數(shù)對(duì)象被創(chuàng)建時(shí),F(xiàn)unction構(gòu)造器會(huì)運(yùn)行類似這樣的代碼: this.prototype = {constructor: this} new一個(gè)函數(shù)事會(huì)發(fā)生: Function.method(new, functio...

    malakashi 評(píng)論0 收藏0
  • JavaScript 語言精粹》讀書筆記 - 函數(shù)

    摘要:語言精粹讀書筆記第四章函數(shù)函數(shù)字面量函數(shù)字面量包含個(gè)部分第一部分,保留字第二部分,函數(shù)名,它可以被忽略。這個(gè)超級(jí)延遲綁定使得函數(shù)對(duì)高度復(fù)用。構(gòu)造器調(diào)用模式一個(gè)函數(shù),如果創(chuàng)建的目的就是希望結(jié)合的前綴來調(diào)用,那它就被稱為構(gòu)造器構(gòu)造。 《JavaScript 語言精粹》 讀書筆記 第四章 函數(shù) Functions 函數(shù)字面量 函數(shù)字面量包含4個(gè)部分: 第一部分, 保留字 function...

    wdzgege 評(píng)論0 收藏0
  • javascript語言精粹學(xué)習(xí)筆記 - 對(duì)象

    摘要:對(duì)象適用于匯集和管理數(shù)據(jù)。一個(gè)對(duì)象字面量就是包圍在一對(duì)花括號(hào)的多個(gè)名值對(duì)。嘗試從對(duì)象里取值將會(huì)導(dǎo)致異常。亦不會(huì)觸及原型鏈中的任何對(duì)象。嚴(yán)格模式下,不能用刪除顯式聲明的標(biāo)識(shí)符,名稱或具名函數(shù)。 Javascirpt里的對(duì)象是無類型的。它對(duì)新屬性的名字和屬性的值沒有任何的限制。對(duì)象適用于匯集和管理數(shù)據(jù)。對(duì)象可以包括其他對(duì)象,所以它們可以容易地表示成樹狀或者圖形結(jié)構(gòu)。 對(duì)象字面量 ...

    LoftySoul 評(píng)論0 收藏0
  • javascript語言精粹學(xué)習(xí)筆記 - 數(shù)組方法實(shí)現(xiàn)

    摘要:在中數(shù)組是經(jīng)常被使用到的,我們除了要學(xué)習(xí)數(shù)組的方法,還需要了解誒一下某一些方法是如何來實(shí)現(xiàn)的。然而我看了語言精粹中方法的一章,想記錄下書上的代碼,以便加深印象。方法移除數(shù)組中的第一個(gè)元素并且放回該元素。 在js中數(shù)組是經(jīng)常被使用到的,我們除了要學(xué)習(xí)數(shù)組的方法,還需要了解誒一下某一些方法是如何來實(shí)現(xiàn)的。然而我看了《javascript語言精粹》中方法的一章,想記錄下書上的代碼,以便加深印...

    felix0913 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<